Поговорим немного о блокировке SQL Server...
Блокировка
Каждый запрос на чтение, изменение или даже вставку или удаление данных должен сначала получить блокировку объекта базы данных. Этим объектом может быть что угодно - от всей базы данных до таблицы, диапазона строк или отдельной строки. Кроме того, существуют различные режимы блокировок, причем некоторые из них более агрессивны, чем другие, насколько они допускают другое поведение.
Частое ожидание получения блокировок является одной из наиболее распространенных характеристик медленной базы данных. Вообще говоря, вы захотите, чтобы ваши операторы SQL блокировали минимально необходимый набор объектов базы данных, чтобы обеспечить стабильный поток трафика. Это означает, что вам нужны полезные и эффективные индексы, которые предотвращают поведение, такое как сканирование таблицы.
Стандартные режимы блокировки
Чтобы понять блокировку на детальном уровне, нам нужно глубже изучить режимы блокировки. Режимы блокировки определяют, какие другие типы запросов могут касаться тех же данных, на которые блокируется запрос.
Примечание. Буквы в скобках в приведенном ниже списке являются стандартными сокращениями SQL Server для этих режимов блокировки и встречаются в некоторых областях SQL Server Management Studio (SSMS).
Эксклюзив (X)
Для монопольной блокировки требуется, чтобы никакая другая активная транзакция (включая транзакции автоматической фиксации / отдельные операторы SQL) не могла касаться заблокированного объекта, пока удерживается монопольная блокировка.
Эксклюзивные блокировки обычно получают путем вставки, обновления и удаления.
Общий (S)
Общие блокировки, как следует из названия, могут быть разделены между транзакциями, которые желают только доступа для чтения к рассматриваемым данным. Общие блокировки не позволяют использовать эксклюзивные блокировки, пока они активны, поэтому эксклюзивные блокировки должны ждать завершения общих блокировок, прежде чем они будут получены.
Обновление (U)
Блокировки обновления представляют собой комбинацию эксклюзивной и общей блокировки. Они обычно используются, когда запись или набор записей должны быть найдены и обновлены. Они допускают общие блокировки для диапазона сканируемых данных, но получают эксклюзивную блокировку для изменяемых данных.
Режимы намеренной блокировки
Преднамеренные блокировки по сути публикуют намерение приобрести блокировку в ближайшем будущем. По сути, это внутренние координационные блокировки, используемые SQL Server для обеспечения правильной работы основных режимов блокировки.
Вы можете рассматривать эти блокировки как эффективную форму светофора, позволяющую очистить запросы, уже выполняющиеся при подготовке к запрашиваемой блокировке. Когда происходят задержки при запросе данных из-за блокировки, они происходят, когда намеренные блокировки ожидают получения своей фактической блокировки - по сути, это трафик, ожидающий получения блокировки и зеленого индикатора.
Таким образом, эти режимы блокировки не требуют много дополнительных деталей, но могут быть перечислены следующим образом:
- Намерение Эксклюзив (IX)
- Общая цель (IS)
- Намеренное обновление (IU)
Конверсионные замки
Блокировки преобразования происходят внутренне, когда SQL-сервер должен преобразовать один тип блокировки в другой. Они эффективно представляют переход от одного типа блокировки к другому между несколькими запросами в транзакции. Типы общих блокировок:
- Совместно с Intent Exclusive (SIX) - переход от общего к эксклюзивному
- Shared with Intent Update (SIU) - Переход от общего доступа к обновлению
- Обновление с помощью Intent Exclusive (UIX) - переход от обновления к Exclusive
Другие замки
Существует несколько других типов блокировок, таких как блокировки схемы и массового обновления, но они не так распространены и не рассматриваются в этой статье.
Блокировка иерархии
Как упоминалось ранее, блокировки могут быть получены на разных уровнях. Каждый уровень содержит иерархию. Например, база данных содержит несколько таблиц, таблицы могут содержать несколько страниц данных, а страницы могут содержать несколько строк.
Блокировки, предоставляемые на высокоуровневых ресурсах, каскадно касаются их дочерних ресурсов, поэтому эффективнее блокировать только несколько строк, чем блокировать страницу, две или даже таблицу. Это может в некоторой степени контролироваться использованием индексов в базе данных.
Почему это важно?
Понимание блокировки на базовом уровне полезно для разработки эффективных баз данных и транзакций, так как индексы влияют не только на чистую скорость поиска - отсутствие правильного использования индекса замедлит другие запросы, вызывая ненужную блокировку базы данных.
0 комментариев
Добавить комментарий