Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
5 УправлениеТранзакциями.docx
Скачиваний:
1
Добавлен:
01.07.2025
Размер:
80.9 Кб
Скачать

Управление изоляцией транзакций

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

  • Идентификатор строки. Идентификатор строки используется для блокировки определенной строки в куче, если не существует кластеризованный индекс.

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

  • Страница. Блокируется 8-килобайтная страница базы данных, которая может быть как страницей данных, так и страницей индекса.

  • Таблица. Блокировка таблицы используется для блокировки всей таблицы для совершения какой-либо операции.

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

  • Разделяемая блокировка (Shared, S). Разделяемые блокировки используются для блокировки данных от доступа для чтения. Они предотвращают изменение данных другими транзакциями, но разрешают чтение данных. Разделяемые блокировки совместимы с другими разделяемыми блокировками, которые разрешают более чем одной транзакции иметь разделяемую блокировку на блокируемый ресурс. Следовательно, транзакции могут читать одни и те же данные параллельно.

  • Монопольная блокировка (Exclusive, X). Монопольные блокировки используются для всех изменений данных. Они предотвращают доступ к данным со стороны других транзакций. Следовательно, монопольные блокировки не совместимы с другими блокировками.

  • Блокировка изменений (Update, U). Блокировки изменений – это частный случай разделяемых блокировок. Они используются, главным образом, для поддержки инструкций UPDATE. В инструкцииUPDATE данные должны считываться перед изменением. Следовательно, необходим такой тип блокировки, который не предотвращает считывания данных другими транзакциями во время считывания их данной транзакцией. Кроме того, когда SQL Server приступает к изменению данных, ему приходится повышать тип блокировки до монопольной. Для этой операции чтения SQL Server использует блокировки изменений, которые совместимы с разделяемыми блокировками, но не совместимы с другими блокировками изменений. Следовательно, другие транзакции могут считывать данные в то время, когда эти данные считываются для инструкции UPDATE, но другим инструкциям UPDATE приходится ждать, пока не будет освобождена блокировка изменений.

  • Блокировка намерения (Intent, I). Блокировки намерения существуют как варианты предыдущих типов блокировки, среди которых блокировка разделяемого намерения, блокировка монопольного намерения и т.д. Они используются для защиты блокировок на нижних уровнях иерархии от запрещающих блокировок на более высоких уровнях иерархии. Рассмотрим ситуацию, при которой транзакция владеет монопольной блокировкой на строку таблицы. В этом случае другие транзакции не могут получить монопольную блокировку на всю таблицу. Чтобы управлять такими ситуациями, используются блокировки намерения на более высоких уровнях иерархии, чтобы уведомить другие транзакции о том, что некоторые ресурсы блокированы на более низких уровнях иерархии. В этом случае, транзакция, удерживающая монопольную блокировку на строку, также блокирует страницу и таблицу блокировкой монопольного намерения.

Полный список типов блокировки и блокируемых ресурсов можно найти в Электронной документации SQL Server 2005, тема «Режимы блокировки».