Введение в дисциплину «Безопасность систем баз данных». Теоретические основы построения реляционных баз данных. Верификация баз данных и проведение аудита в СБД. Распределенные базы данных, страница 36

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

Управление блокировками в SQL Server 2005 осуществляет специальная подсистема – менеджер блокировок (Lock Manager). Этот процесс в значительной степени автоматизирован: система сама выбирает нужный уровень блокирования и устанавливает блокировку соответствующего типа. Блокировки могут накладываться на строку таблицы или на таблицу целиком, на страницу, экстент и на отдельные строки.

Пользователь при помощи команд Transact-SQL может оказывать влияние на установку того или иного режима блокирования. Существуют разные способы сделать это, но наиболее распространенными можно считать следующее:

·  задание уровня изолированности транзакции;

·  управление блокировками на уровне команд.

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

Чтобы обеспечить требуемый уровень блокирования, сервер накладывает на данные блокировку того или иного типа. Большинством СУБД поддерживаются четыре основных типа блокировок.

1. Коллективная блокировка (Shared, S).

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

2. Монопольная (эксклюзивная) блокировка (eXclusive, X).

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

3. Блокировка обновления (Update, U).

Данная блокировка используется на этапе подготовки данных к изменению. Что понимается под подготовкой? Пусть на данные d установлена блокировка S. Некая транзакция T пытается изменить их. Для этого ей необходимо поставить монопольную блокировку на данные, но сделать этого сразу она не может: надо ждать полного разблокирования данных, т. е. «поймать момент», когда все блокировки S будут сняты. Для этого транзакция T устанавливает на ресурсы d блокировку обновления U, а не монопольную блокировку X. После этого менеджер блокировок запрещает другим транзакциям накладывать на них блокировки S и U. Как только все коллективные блокировки снимаются, установленная блокировка U автоматически повышается до уровня блокировки X, и начинается запись.

4. Блокировки намерений (предупреждающие блокировки).

Установка блокировок S, X и U – непростая процедура, требующая множества проверок. Прежде чем установить блокировку, менеджер должен проверить, не заблокированы ли данные в настоящий момент, и совместим ли тип запрашиваемой блокировки – с типом наложенной. Причем на практике транзакция зачастую требует блокировки не на одну строчку таблицы, а на целое множество строк, или на несколько страниц, принадлежащих одному экстенту, и т. п. В такой ситуации затраты на блокирование строк (страниц) были бы неоправданно высокими, если бы не возможность предупреждающего блокирования.

Как уже было замечено, блокироваться может целая таблица или отдельные строки, страница данных или экстент. Очевидна иерархичность: таблица располагается в нескольких экстентах, в экстент вложено восемь страниц, а в каждую таблицу – множество строк. Блокировки намерения предназначены для подготовки к блокированию множества элементов данных, принадлежащих элементу данных более высокого уровня.

Блокировки намерений подразделяются на монопольные (Intent eXclusive, IX), коллективные (Intend Shared, IS) и коллективно-монопольные (Shared with Intend eXclusive, SIX). Правила протокола предупреждающего блокирования следующие.

1. Чтобы затребовать блокировку S или X на некоторые элементы данных, менеджер блокировок обращается к корневому элементу иерархии (собственно, корневым элементом является БД).