Опубликован: 11.12.2006 | Доступ: свободный | Студентов: 5820 / 381 | Оценка: 4.42 / 3.86 | Длительность: 57:15:00
Лекция 19:

Транзакции и блокировка транзакций

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

Режим блокировки указывает, каким образом одновременно работающие пользователи (или транзакции) могут осуществлять доступ к какому-либо ресурсу. Захват каждого типа блокировки происходит в одном из этих режимов. Имеется шесть режимов блокировки: разделяемая блокировка (shared), блокировка изменений (update), монопольная блокировка (exclusive), блокировка намерения (intent), блокировка схемы (schema) и блокировка массовых изменений (bulk update).

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

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

Блокировка изменений

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

Монопольная блокировка

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

Блокировка намерения

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

  • Разделяемое намерение (Intent shared). Указывает, что в транзакции предполагается наложить на ресурс разделяемую блокировку.
  • Монопольное намерение (Intent exclusive). Указывает, что в транзакции предполагается наложить на ресурс монопольную блокировку.
  • Разделяемо-монопольное намерение (Shared with intent exclusive). Указывает, что в транзакции предполагается наложить разделяемую блокировку на некоторые ресурсы и монопольную блокировку на другие ресурсы.

Для получения более подробной информации по этим типам режимов найдите "shared lock mode" (режим разделяемой блокировки) в Books Online и выберите "Understanding Locking in SQL Server" (Ознакомление с блокировкой в SQL Server) в диалоговом окне Topics Found.

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

Режим блокировки схемы используется в тех случаях, когда выполняется операция изменения схемы таблицы, такая как добавление колонки в таблицу, или когда компилируются запросы. Для таких случаев существует два типа блокировок схемы: блокировка модификации схемы (Sch-M) и блокировка стабильности схемы (Sch-S). Блокировка модификации схемы используется при выполнении операции языка определения данных таблицы (DDL). Блокировка стабильности схемы используется для компиляции запросов. Когда происходит компиляция запроса, другие транзакции могут одновременно с этим запускать и захватывать блокировки по данной таблице (даже монопольные блокировки), но операторы DDL не могут применяться к таблице, если задана блокировка стабильности схемы.

Блокировка массовых изменений

Режим блокировки массовых изменений используется, когда вам нужно выполнить массовое копирование данных в таблицу с подсказкой блокировки TABLOCK или когда вы задаете параметр table lock on bulk load с помощью хранимой процедуры sp_tableoption. Целью блокировки массовых изменений является предоставление процессам разрешения на параллельное массовое копирование данных в одну таблицу, запрещая при этом доступ к этой таблице любым процессам, которые не выполняют массового копирования.