Skip to content

Управление параллельным выполнением транзакций с помощью блокировок в SQL Server

Пересказ статьи Rajendra Gupta. Manage Transaction Concurrency Using Locks in SQL Server


В многопользовательской среде важно поддерживать конкурирующие транзакции. Связанные с этим блокировки представляют собой структуры в памяти размером 96 байт. Их роль заключается в поддержке целостности данных, согласованности, управлении параллелизмом для каждой транзакции. SQL Server следует требованиям ACID для каждой транзакции.

  • Atomicity (атомарность): это свойство гарантирует, что транзакция, включающая два и более процессов, выполняется полностью, или ни один из процессов не будет зафиксирован.

  • Consistency (согласованность): это дает гарантию состояния зафиксированной транзакции. Транзакция должна либо создавать новое состояние данных, либо возвращать предыдущее состояние.

  • Isolation (изоляция): это означает, что транзакции изолированы друг от друга. Если транзакция выполняется и еще не зафиксировала данные, она изолирована от других транзакций.

  • Durability (длительность): длительность гарантирует, что зафиксированные данные никогда не будут потеряны. Это предотвращает потерю данных от сбоев питания или операционной системы, или других ошибок программного обеспечения.


Чтобы обеспечить выполнение свойств ACID, SQL Server накладывает на объекты различные типы блокировок. В таком случае другие транзакции переходят в состояние ожидания снятия блокировки.

Режимы блокирования


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

  • Разделяемые блокировки:

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

    • Множество транзакций может накладывать разделяемую блокировку в одно и то же время на строку или страницу.

    • Это обычная блокировка, которую вы наблюдаете на объектах вашей базы данных.



В следующем коде T-SQL мы запрашиваем запись заказчика по конкретному ID заказчика. Далее мы используем динамическое административное представление sys.dm_tran_locks для проверки существующих блокировок.

BEGIN TRAN
SELECT * FROM [SalesLT].[Customer] WITH (HOLDLOCK)
WHERE CustomerID=1
SELECT resource_type, request_mode, resource_description
FROM sys.dm_tran_locks
WHERE resource_type <> 'DATABASE'
ROLLBACK

Как показано ниже, имеется разделяемая блокировка на данном id ресурса (8194443284a0):



  • Эксклюзивные (X) блокировки:
    • SQL Server использует эксклюзивную блокировку (X-блокировка) для операций DML (Delete, Insert или Update), требующих модификацию строки или страницы данных.

    • Она предотвращает доступ других пользователей к ресурсу пока наложена блокировка.

    • SQL Server может может иметь только одну эксклюзивную блокировку на странице или строке в пределах транзакции.



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

BEGIN TRAN
UPDATE [SalesLT].[Customer]
SET Suffix='Mr.'
WHERE CustomerID=1
SELECT resource_type, request_mode, resource_description
FROM sys.dm_tran_locks
WHERE resource_type <> 'DATABASE'
ROLLBACK




  • Блокировки обновления (U):

    • Блокировка обновления подобна эксклюзивной блокировке. Она может накладываться на запись, имеющую разделяемую блокировку.

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

    • SQL Server не может наложить разделяемую блокировку на ресурс с блокировкой обновления.

    • Вы можете также использовать WITH UPDLOCK для принудительной блокировки обновления.



Следующий пример показывает блокировку обновления на id ресурса (8194443284a0):

BEGIN TRAN
SELECT * FROM [SalesLT].[Customer] WITH (UPDLOCK)
WHERE CustomerID=1
SELECT resource_type, request_mode, resource_description
FROM sys.dm_tran_locks
WHERE resource_type <> 'DATABASE'
ROLLBACK



  • Блокировки с намерением (Intent locks):

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

    • Транзакция не позволяет другим транзакциям получить эксклюзивную блокировку на таблицу, использующую блокировку с намерением.

    • Типы блокировок с намерением перечислены ниже.

      • Разделяемая блокировка с намерением (IS): указывает, что SQL Server намерен прочитать ресурсы ниже в иерархии, запрашивая разделяемую блокировку индивидуально на эти ниже находящиеся в иерархии ресурсы.

      • Эксклюзивная блокировка с намерением (IX): указывает, что SQL Server намерен модифицировать ресурсы ниже в иерархии, получая эксклюзивную блокировку на эти ниже находящиеся в иерархии ресурсы.

      • Блокировка обновления с намерением (IU): может запрашиваться только на уровне страницы для ресурсов ниже в иерархии, и по завершению обновления преобразуется в IX-блокировку.


Как показано ниже, транзакция имеет эксклюзивную блокировку на ключе, и она имеет эксклюзивную блокировку с намерением на уровне страницы.



Конверсионные блокировки


SQL Server преобразует типы блокировок для поддержки множества запросов в пределах транзакции. Эти блокировки известны как конверсионные.

  • SIX - разделяемая с эксклюзивной блокировкой с намерением: Транзакция SQL Server удерживает разделяемую блокировку на нескольких страницах и имеет эксклюзивную блокировку на нескольких строках.

  • SIU - транзакция SQL Server удерживает разделяемую блокировку на нескольких страницах и имеет блокировку обновления на нескольких строках.

  • UIX - обновления с эксклюзивной блокировкой с намерением: транзакция SQL Server удерживает блокировку обновления на нескольких страницах и имеет эксклюзивную блокировку на нескольких строках.


Блокировки схемы


SQL Server предоставляет два вида блокировки схем.

  • Блокировка стабильности схемы (Sch-S): эта блокировка используется, когда схема в зависимости от запроса компилируется, и генерируется ее план выполнения. (Sch-S не накладывает никаких блокировок на данные объекта.

  • Блокировка модификации схемы (Sch-M): эта блокировка является результатом выполнения запроса DDL (язык определения данных). SQL Server может иметь только одну блокировку модификации схемы на объект. Вы не можете модифицировать объект при данной блокировке схемы.


В примере ниже мы получаем обе блокировки Sch-S и Sch-M при модификации определения объекта.

BEGIN TRAN
Alter TABLE DemoTable ADD new bit
SELECT resource_type, request_mode, resource_description
FROM sys.dm_tran_locks
WHERE resource_type <> 'DATABASE'
ROLLBACK



Совместимость блокировок


Совместимость блокировок помогает проверить допустимость блокировок в случае одновременного выполнения нескольких транзакций на одном и том же ресурсе. Если транзакция накладывает блокировку, новая блокировка, накладываемая другой транзакцией, должна быть с ней совместима. Таким образом, вы можете просмотреть следующий список совместимости для нахождения поддерживаемых блокировок при выполнении нескольких транзакций.



Эскалации блокировок


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

Для эскалации блокировок используются следующие пороговые значения.

  • Порог памяти: пороговое значение блокировки памяти устанавливается на 40 процентах заблокированной памяти.

  • Порог блокировок: если число блокировок, установленных на текущей таблице или индексе больше 5000, может быть включена эскалация блокировок.


Пользователи могу управлять эскалацией блокировок, используя оператор alter table. Вы можете полностью запретить эскалацию блокировок для этой таблицы, используя значение параметра DISABLE.

ALTER TABLE Table_name SET (LOCK_ESCALATION = < TABLE | AUTO | DISABLE > –одна из этих опций) GO

Обратитесь к документации Microsoft за подробной информацией об эскалации блокировок.

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

Заключение


Эта статья дает подробный обзор блокировок в SQL Server и DMV для мониторинга блокировки и процесса ее эскалации. Блокирование - это совершенно нормальное поведение в SQL Server, и вы должны быть знакомы с этим, чтобы понимать, как работают множественные транзакции.

Обратные ссылки

Нет обратных ссылок

Комментарии

Показывать комментарии Как список | Древовидной структурой

Нет комментариев.

Автор не разрешил комментировать эту запись

Добавить комментарий

Enclosing asterisks marks text as bold (*word*), underscore are made via _word_.
Standard emoticons like :-) and ;-) are converted to images.

To prevent automated Bots from commentspamming, please enter the string you see in the image below in the appropriate input box. Your comment will only be submitted if the strings match. Please ensure that your browser supports and accepts cookies, or your comment cannot be verified correctly.
CAPTCHA

Form options

Добавленные комментарии должны будут пройти модерацию прежде, чем будут показаны.