Эскалация блокировок в Microsoft SQL Server

Приветствую Вас на сайте Info-Comp.ru! В данном материале мы продолжим разговор о блокировках в Microsoft SQL Server, и сегодня мы рассмотрим эскалацию блокировок.

Эскалация блокировок в Microsoft SQL Server

Заметка! Блокировки в Microsoft SQL Server – что это такое и для чего нужны.

Что такое эскалация блокировок

Эскалация блокировки – это процесс преобразования многих мелкогранулированных блокировок в меньшее число крупногранулированных блокировок, что снижает накладные расходы системы и увеличивает вероятность конкуренции за параллелизм.

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

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

По мере того как SQL Server получает низкоуровневые блокировки, он устанавливает блокировки намерений на объекты, которые содержат ресурсы более низкого уровня:

  • При блокировке строк или диапазонов ключей индекса SQL Server накладывает блокировку намерений на страницы, содержащие эти строки или ключи;
  • При блокировании страниц SQL Server накладывает блокировку намерений на объекты более высокого уровня, содержащие эти страницы.

Заметка! Типы блокировок в Microsoft SQL Server.

SQL Server может для одной и той же инструкции устанавливать блокировку как на строки, так и на страницы, чтобы свести к минимуму количество блокировок и исключить необходимость эскалации этой блокировки. Например, он может устанавливать блокировки страниц в некластеризованном индексе и блокировки строк в страницах данных.

Чтобы эскалировать блокировки, SQL Server пытается изменить блокировку с намерением в таблице на соответствующую полную блокировку, например, изменить блокировку с намерением эксклюзивного доступа (IX) на эксклюзивную (X) или блокировку с намерением совмещаемого доступа (IS) на совмещаемую (S).

Если попытка эскалации блокировки закончилась успешно, и получена полная блокировка таблицы, то освобождаются все блокировки кучи, индекса, страниц (PAGE), а также блокировки на уровне строк (RID), которые удерживались транзакцией на кучу или индекс. Если не удалось получить полную блокировку, в этот момент эскалация блокировки не происходит и SQL Server продолжит получать блокировки строк, ключей или страниц.

Заметка! Как посмотреть блокировки в Microsoft 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 новых блокировок.

Заметка! Всем тем, кто только начинает свое знакомство с языком SQL, рекомендую прочитать книгу «SQL код» – это самоучитель по языку SQL для начинающих программистов. В ней очень подробно рассмотрены основные конструкции языка.

На сегодня это все, надеюсь, материал был Вам полезен!

Понравилась статья? Поделиться с друзьями:
Заметки IT специалиста
Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!:
Нажимая на кнопку «Отправить комментарий», я даю согласие на обработку персональных данных и принимаю политику конфиденциальности.