תופעות
שקול את התרחיש הבא:
-
יש לך מסד נתונים הכולל את האפשרויות ALLOW_SNAPSHOT_ISOLATIONוREAD_COMMITTED_SNAPSHOT זמינות ב-Microsoft SQL Server 2008 R2.
-
אתה מפעיל משפט select המכיל TABLOCK ו- UPDLOCK לעומת טבלה במסד הנתונים.
-
המשפט Select גולש בתוך TRAN מפורש בהתחלה, אך האפשרות ' בצע טראן ' אינה מתבצעת.
-
שתיים נוספות מאותן שאילתות שהתחילו עם אותם עצות לגבי שאילתה נמצאות בטרנזקציה המפורשת.
בתרחיש זה, כאשר השאילתה הראשונה מחויבת, אחת מהשאילתות האחרות תהפוך לקיפאון.
סיבה
הבעיה מתרחשת מכיוון ש-SQL Server מדווח באופן שגוי על קיפאון באחד מהתרחישים הבאים:
-
כאשר ALLOW_SNAPSHOT_ISOLATIONוREAD_COMMITTED_SNAPSHOT מופעלים עבור מסד נתונים, ניתן לדווח על שאילתות מרובות על אותה טרנזקציה כאשר אחת מהן הושלמה באופן שגוי.
-
כאשר ALLOW_SNAPSHOT_ISOTION מופעל ומתבצעת השימוש בעצות TABLOCK ו- UPDLOCK , משפט select השני והשלישי מעביר את הנעילה התשיעית ליעד כדי להמיר ל-X. נעילות IX מסתיימות בקיפאון כאשר ניסיון להמיר ל-X מתבצע.
-
כאשר ALLOW_SNAPSHOT_ISOLATION אינו זמין, השאילתה השניה והשלישית יקבלו מנעול של שש. במצב זה, כאשר ששת המנעול מומר ל-X, זהו רק תרחיש חסימה, ולא קיפאון.
פתרון
הבעיה נפתרה לראשונה בעדכון המצטבר הבא של SQL Server. לאחר שתחיל את התיקון החם, SQL Server יפתור את הבעיה על-ידי הקלטה אם המערכת מקבלת רמז לקריאה או רמז של NOLOCK עבור מסד הנתונים והשאילתה. מידע זה משמש כדי לבחור את סוג הנעילות הנכון כדי לטפל במצב כראוי, במקום לדווח באופן שגוי על קיפאון.
עדכון מצטבר 11 עבור SQL Server 2008 R2 SP2 /en-us/help/2926028
כל עדכון מצטבר חדש עבור SQL Server מכיל את כל התיקונים החמים ואת כל תיקוני האבטחה שנכללו בעדכון המצטבר הקודם. עיין בעדכונים המצטברים האחרונים עבור SQL Server:
מצב
Microsoft אישרה שזוהי בעיה במוצרי Microsoft המופיעים בסעיף "חל על".