Ескалація блокувань в microsoft sql server

109

Вітаю вас на сайті info-comp.ru! у цьому матеріалі ми продовжимо розмову про блокування в microsoft sql server, і сьогодні ми розглянемо ескалацію блокувань.

Що таке ескалація блокувань

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

Іншими словами, блокування при меншій гранулярності, наприклад, на рівні рядків, збільшує паралелізм, але в той же час збільшує і накладні витрати на обробку, оскільки при великій кількості блокованих рядків потрібно більше блокувань.

Блокування на більшому рівні гранулярності, наприклад, на рівні таблиць, обходяться дорого щодо паралелізму, оскільки блокування цілої таблиці обмежує доступ до всіх частин таблиці іншим транзакціям. Однак накладні витрати в цьому випадку нижче, оскільки менше кількість підтримуваних блокувань.

Коли sql server отримує низькорівневі блокування, він встановлює блокування намірів на об’єкти, які містять ресурси нижчого рівня:

  • при блокуванні рядків або діапазонів ключів індексу sql server накладає блокування намірів на сторінки, що містять ці рядки або ключі;
  • при блокуванні сторінок sql server накладає блокування намірів на об’єкти вищого рівня, що містять ці сторінки.

Sql server може для однієї і тієї ж інструкції встановлювати блокування як на рядки, так і на сторінки, щоб звести до мінімуму кількість блокувань і виключити необхідність ескалації цього блокування. Наприклад, він може встановлювати блокування сторінок в некластеризованому індексі і блокування рядків в сторінках даних.

Щоб ескалувати блокування, sql server намагається змінити блокування з наміром в таблиці на відповідне повне блокування, наприклад, змінити блокування з наміром ексклюзивного доступу (ix) на ексклюзивну (x) або блокування з наміром суміщуваного доступу (is) на суміщену (s).

Якщо спроба ескалації блокування закінчилася успішно, і отримана повна блокування таблиці, то звільняються всі блокування купи, індексу, сторінок (page), а також блокування на рівні рядків (rid), які утримувалися транзакцією на купу або індекс. Якщо не вдалося отримати повне блокування, в цей момент ескалація блокування не відбувається і sql server продовжить отримувати блокування рядків, ключів або сторінок.

Sql server не ескалує блокування рядків або діапазону ключів до блокування сторінок, а підвищує їх прямо до блокування таблиць. Точно так само блокування сторінок завжди укрупнюються до блокувань таблиць. Замість блокування всієї таблиці, блокування розділених таблиць може бути збільшено до рівня hobt для пов’язаної секції. Блокування на рівні hobt не обов’язково блокує вирівняні ідентифікатори hobt цієї секції.

Блокування на рівні hobt зазвичай підвищують паралелізм, але створюють потенційний ризик взаємоблокування в тому випадку, коли транзакції блокують різні секції і намагаються поширити ексклюзивну блокування на інші секції. У рідкісних випадках гранулярність блокування table може виявитися більш вдалим рішенням.

Коли відбувається ескалація блокувань

Ескалація блокування включається в тому випадку, якщо вона не виключена для таблиці з допомогою параметра alter table set lock_escalation і якщо виконується одна з наступних умов:

  • одна інструкція t-sql отримує більше 5000 блокувань в одній несекционированной таблиці або індексі;
  • одна інструкція t-sql отримує більше 5000 блокувань в одній секції розділити таблиці, а параметр alter table set lock_escalation встановлений у значення ” auto;
  • кількість блокувань в екземплярі sql server перевищує обсяг пам’яті або задані порогові значення.

Якщо спроба ескалації блокування закінчується невдачею через конфлікти блокувань, які утримуються паралельними транзакціями, sql server повторює спробу при отриманні кожних 1250 нових блокувань.

На сьогодні це все, сподіваюся, матеріал був вам корисний!