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


48

Мне задали этот вопрос на собеседовании, и у меня не было ответа. Может кто-нибудь здесь объяснить?

Ответы:


45

Блокировки БД могут существовать для строк, страниц или целых таблиц или индексов. Когда транзакция выполняется, блокировки, удерживаемые транзакцией, занимают ресурсы. Эскалация блокировок - это когда система объединяет несколько блокировок в блокировку более высокого уровня (например, консолидацию блокировок нескольких строк на странице или нескольких страниц во всей таблице), как правило, для восстановления ресурсов, занятых большим количеством мелкозернистых блокировок.

Это будет сделано автоматически, хотя вы можете установить флаги для таблиц (см. ALTER TABLE в книгах в Интернете), чтобы управлять политикой эскалации блокировок для этой конкретной таблицы. В частности, преждевременное или чрезмерное усиление блокировки раньше было проблемой в более старых версиях Sybase и SQL Server, когда два процесса одновременно записывали отдельные строки в одну и ту же страницу. Если вы вернетесь достаточно далеко (IIRC SQL Server 6.5), SQL Server фактически не имел блокировки строк, но мог блокировать только таблицы или страницы. Там, где это произошло, вы можете получить конфликт между вставками записей на одной странице; часто вы помещаете кластерный индекс в таблицу, чтобы новые вставки переходили на разные страницы.


3
Следует также отметить, что мы не контролируем, когда сервер обостряется.

Мы делаем сейчас. Это звоните T1211.
Джошуа

@Joshua, флаг трассировки 1211 используется для отключения эскалации блокировки. Мы не можем сообщить SQL Server об эскалации в определенное время.
Просто ученик

10
Блокировки строк не увеличиваются до блокировок страниц, а непосредственно - до блокировок таблиц.
Манодж Пандей

Это верно, что сказал Манодж. Вы должны исправить эту часть в своем ответе, чтобы не вводить в заблуждение менее опытных пользователей SQL Server
NikolaD

21

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

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


12

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

  • Блокировки строк всегда преобразуются в блокировки таблиц, и
  • Блокировки страниц также увеличиваются до блокировок таблиц.

Это миф о том, что блокировки строк увеличиваются до блокировок страниц , то же самое, что упомянуто выше @ConcernedOfTunbridgeWells, неправильно.

Если в таблице очень мало обновлений строк, движок SQL попытается использовать блокировку строк в этих строках или блокировку страниц на этих страницах. Допустим, это заняло Row-Lock. Но если обновления строки увеличивают пороговое значение (~ 5 тыс. Блокировок), то вместо нескольких блокировок строк требуется одна блокировка таблицы. Таким образом, это уменьшает накладные расходы памяти, выпуская несколько блокировок строк и принимая одну блокировку таблиц, но увеличивает параллелизм. То же самое происходит с блокировкой страницы.

Порог Укрупнение блокировки находится на- крайней мере , 5000 замков, и зависит от нескольких факторов, подробное объяснение эскалация блокировок было упомянуто здесь в MSDN Бол: https://technet.microsoft.com/en-us/library/ms184286(v = sql.105) .aspx


5

Повышение блокировки означает преобразование блокировки в более ограничительный режим. Это чаще всего наблюдается в базах данных. В запросе может быть заблокирован ресурс для «общего доступа» и он может быть преобразован в «эксклюзивный» для выполнения обновления.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.