Создание и управление индексами. Создание и управление встроенными процедурами. Оптимизация производительности запросов. Управление транзакциями и блокировками, страница 32

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

Проблемы конкуренции, решаемые блокировками

Блокировки могут предотвратить следующие ситуации, которые обеспечивают целостность транзакций.

Потеря обновления. Обновление может быть потеряно, когда транзакция перезаписывает изменения из другой транзакции. Для примера, два пользователя могут изменять определённую информацию, но только изменения последнего отразятся в базе данных.

Незавершённые зависимости. Возникают, когда транзакция читает данные из другой транзакции.

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

Блокируемые ресурсы

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

Элемент

Описание

RID

Идентификатор строки, используется для блокирования одной строки в таблице

Key

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

Page

8кб страница данных или страница индексов

Extent

Пространство – смежная группа страниц данных или страниц индексов – используется в момент выделения пространства

Table

Содержимое таблицы, включая все данные и индексы

Database

Содержимое базы данных, используется во время восстановления базы данных

Типы блокировок

Сервер SQL поддерживает два основных типа блокировок: базовые и блокировки для специальных ситуаций.

Базовые блокировки. Обычно, операции чтения требуют разделяемые блокировки, а операции записи требуют монопольные блокировки.

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

Рассматривайте следующие факты о разделяемых блокировках:

*  Они используются только для операций чтения, данные не могут быть изменены;

*  Сервер SQL освобождает разделяемую блокировку на строку так скоро, как только следующая строка будет прочитана;

*  Разделяемая блокировка будет существовать пока все строки соответствующие запросу не будут возвращены клиенту.

Сервер SQL использует монопольные блокировки для операторов изменения INSERT, UPDATE или DELETE.

Рассматривайте следующие факты о монопольных блокировках:

*  Только одна транзакция может установить монопольную блокировку на ресурс

*  Транзакция не может запросить разделяемую блокировку на ресурс, который имеет монопольную блокировку

*  Транзакция не может установить монопольную блокировку, пока все разделяемые блокировки не освободятся

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

Intent locks. Сервер использует эти блокировки внутренне для минимизации конфликтов блокировок. Например, если транзакция имеет монопольную блокировку на строку, то intent lock предотвращает установку монопольных блокировок на таблицу.

Update locks. Сервер использует эти блокировки, когда в будущем будет изменять страницы. До изменения страниц, сервер стимулирует обновляемые страницы в блокировку монопольного режима для предотвращения конфликтов.