Мне задали этот вопрос на собеседовании, и у меня не было ответа. Может кто-нибудь здесь объяснить?
Мне задали этот вопрос на собеседовании, и у меня не было ответа. Может кто-нибудь здесь объяснить?
Блокировки БД могут существовать для строк, страниц или целых таблиц или индексов. Когда транзакция выполняется, блокировки, удерживаемые транзакцией, занимают ресурсы. Эскалация блокировок - это когда система объединяет несколько блокировок в блокировку более высокого уровня (например, консолидацию блокировок нескольких строк на странице или нескольких страниц во всей таблице), как правило, для восстановления ресурсов, занятых большим количеством мелкозернистых блокировок.
Это будет сделано автоматически, хотя вы можете установить флаги для таблиц (см. ALTER TABLE в книгах в Интернете), чтобы управлять политикой эскалации блокировок для этой конкретной таблицы. В частности, преждевременное или чрезмерное усиление блокировки раньше было проблемой в более старых версиях Sybase и SQL Server, когда два процесса одновременно записывали отдельные строки в одну и ту же страницу. Если вы вернетесь достаточно далеко (IIRC SQL Server 6.5), SQL Server фактически не имел блокировки строк, но мог блокировать только таблицы или страницы. Там, где это произошло, вы можете получить конфликт между вставками записей на одной странице; часто вы помещаете кластерный индекс в таблицу, чтобы новые вставки переходили на разные страницы.
Это метод снижения системных издержек путем преобразования многих мелкозернистых замков в меньшее количество грубозернистых. Более подробную информацию можно найти здесь и здесь .
Например, если у вас есть много (обычно сотни или более) блокировок для определенных строк в таблице, когда вы превысите максимально допустимое количество блокировок, их можно заменить на блокировку для всей таблицы.
источник
SQL Server выполняет эскалацию блокировок , чтобы уменьшить накладные расходы памяти путем преобразования нескольких мелкозернистых низкоуровневых блокировок в грубозернистые высокоуровневые блокировки.
Это миф о том, что блокировки строк увеличиваются до блокировок страниц , то же самое, что упомянуто выше @ConcernedOfTunbridgeWells, неправильно.
Если в таблице очень мало обновлений строк, движок SQL попытается использовать блокировку строк в этих строках или блокировку страниц на этих страницах. Допустим, это заняло Row-Lock. Но если обновления строки увеличивают пороговое значение (~ 5 тыс. Блокировок), то вместо нескольких блокировок строк требуется одна блокировка таблицы. Таким образом, это уменьшает накладные расходы памяти, выпуская несколько блокировок строк и принимая одну блокировку таблиц, но увеличивает параллелизм. То же самое происходит с блокировкой страницы.
Порог Укрупнение блокировки находится на- крайней мере , 5000 замков, и зависит от нескольких факторов, подробное объяснение эскалация блокировок было упомянуто здесь в MSDN Бол: https://technet.microsoft.com/en-us/library/ms184286(v = sql.105) .aspx
источник
Повышение блокировки означает преобразование блокировки в более ограничительный режим. Это чаще всего наблюдается в базах данных. В запросе может быть заблокирован ресурс для «общего доступа» и он может быть преобразован в «эксклюзивный» для выполнения обновления.
источник