Як SQL Server визначає порядок блокування, під час вибору таблиці?


10

У мене є дві збережені процедури, які глухо замикаються, коли система перебуває під навантаженням. Proc A вибирається з таблиці, тоді як Proc B вставляється в ту саму таблицю. Графік блокування показує, що Proc A має блокування сторінки в режимі S, для якого Proc B хоче заблокувати режим IX, Proc A однак чекає блокування сторінки в режимі S для іншої сторінки, для якої у Proc B вже заблоковано сторінку в режимі IX .

Зрозуміло, це можна було б розібрати, забезпечивши, що обидва запити блокують сторінки в таблиці в одному порядку, але я не можу зрозуміти, як це зробити.

Моє запитання: Як SQL Server визначає, в якому порядку блокувати сторінки, роблячи INSERTs і SELECTs, і як можна змінити цю поведінку?

Відповіді:


2

Як SQL Server визначає, в якому порядку блокувати сторінки під час виконання INSERTs та SELECTs a

Не визначено - робиться внутрішньою обробкою та залежно від виводу оптимізатора запитів.

і як можна змінити таку поведінку?

Контролюйте свою ізоляцію. Якщо ви читаєте, щоб писати, скажіть SQL Server негайно отримати блокування запису. Точка закрита.


1

Наразі Pro A має загальний замок.

"Жодні інші транзакції не можуть змінювати дані, поки спільні (S) блокування існують на ресурсі." http://msdn.microsoft.com/en-us/library/aa213039%28v=sql.80%29.aspx

Якщо ви перебуваєте на sql 2005 року або вище, спробуйте використати ізоляцію знімків.

"Рівень ізоляції знімків використовує версію рядків, щоб забезпечити послідовність зчитування на рівні транзакцій. Операції зчитування не набувають жодних блоків сторінок чи рядків; отримуються лише блокування таблиць SCH-S. Під час читання рядків, модифікованих іншою транзакцією, вони отримують версію рядка, що існувало, коли транзакція розпочалася. Ви можете використовувати ізоляцію Snapshot проти бази даних лише тоді, коли параметр бази даних ALLOW_SNAPSHOT_ISOLATION встановлений увімкнено. За замовчуванням для баз даних користувачів ця опція вимкнена. " http://msdn.microsoft.com/en-us/library/ms189122.aspx

Оскільки придбані лише замки Sch-S, ваше запитання "читання не повинно бути в змозі блокувати ваше".

"Блоки стабільності схеми (Sch-S) не блокують жодних блоків транзакцій, у тому числі ексклюзивних (X) замків." http://msdn.microsoft.com/en-us/library/ms189122.aspx

Пам’ятайте, що рівень ізоляції Snapshot широко використовує tempdb для версій версій, тому розміріть його відповідним чином та дотримуйтесь найкращих практик стратегій дискових темпдб.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.