Режимы блокировки определяют различные виды замков. Выбор того, какой режим блокировки нужно применить, зависит от того ресурса, который нужно блокировать. Следующие три типа замков используются для блокирования на уровне строк и на уровне страниц:
♦ разделяемый (shared, S);
♦ исключительный (exclusive, Е);
♦ обновление (update, U).
Разделяемая блокировка резервирует ресурс (страницу или строку) только для чтения. Другие процессы не могут изменять заблокированный ресурс, пока блокировка не будет снята. С другой стороны, отдельные процессы могут устанавливать разделяемую блокировку для этого ресурса в то же самое время, т. е. другие процессы могут читать ресурс, заблокированный при помощи разделяемой блокировки.
Исключительная блокировка резервирует страницу или строку для исключительного использования в одной транзакции. Она используется для операторов DML (insert, update или delete), которые изменяют ресурс. Исключительная блокировка не может быть установлена, если некоторый другой процесс сохраняет разделяемую или исключительную блокировку на этот ресурс, т. е. для ресурса может существовать только одна исключительная блокировка. Как только на страницу (или строку) устанавливается исключительная блокировка, никакая другая блокировка не может быть установлена на тот же самый ресурс.
Блокировка обновления может быть установлена, только если не существует другой блокировки обновления или исключительной блокировки. При этом она может быть установлена на объекты, которые уже имеют разделяемую блокировку. В этом случае блокировка обновления получает и другую разделяемую блокировку на тот же объект. Если транзакция, которая изменяет объект, подтверждается, блокировка обновления заменяется на исключительную блокировку, если для объекта не существует других блокировок.
В табл. 13.1 показана матрица совместимости разделяемых, исключительных блокировок и блокировок обновления. Эта матрица интерпретируется следующим образом: предположим, транзакция Т\ имеет блокировку, как показано в первом столбце матрицы; предположим также, что некоторая другая транзакция Т2 запрашивает блокировку, как задано в соответствующем заголовке столбца. В этом случае «Да» означает, что блокировка для Т2 возможна, в то время как «Нет» указывает на конфликт с существующей блокировкой.
На уровне таблицы существуют пять различных типов блокировок:
♦ разделяемая (shared, S);
♦ исключительная (exclusive, X);
♦ разделяемая блокировка с намерением (intent shared, IS);
♦ исключительная блокировка с намерением (intent exclusive, IX);
♦ разделяемая блокировка с намерением исключительного доступа (shared with intent exclusive, SIX).
Разделяемые и исключительные блокировки соответствуют блокировкам на уровне строки (или страницы) с тем же именем. Как правило, блокировка с намерением показывает намерение установить блокировку на ресурс более низкого уровня в иерархии объектов базы данных. Поэтому блокировки с намерением помещаются в иерархии объектов на один уровень выше того объекта, который этот процесс намеревается заблокировать. Это эффективный способ выяснить, возможна ли подобная блокировка, здесь также устанавливается запрет другим процессам блокировать более высокий уровень до того, как нужная блокировка будет достигнута.
В табл. 13.2 показана матрица совместимости всех видов блокировок таблиц. Интерпретация этой матрицы в точности соответствует интерпретации матрицы в табл. 13.1.