Блокирование информационных объектов базы данных

Все современные СУБД ориентированы на поддержку одновременной работы многих пользователей, а следовательно, на параллельную обработку транзакций. Для кор­ректной обработки параллельных транзакций без возникновения конфликтных ситуаций необходимо использовать некоторыйметод управления параллелизмом. Основным методом управления параллелизмом является блокирование (альтернативными являются метод временных меток и оптимистичные технологии).

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

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

 

блокирования. Для пояснения идеи блокирования рассмотрим пример, приведенный на рис.14.1

 

 

Рис. 14.1 Пример блокирования таблиц БД

В данном примере предполагается, что БД состоит из 3 таблиц (ТОВАР, ОТДЕЛЕНИЕ, ЗАКАЗ). Блокирование производится на уровне таблиц, т.е. сразу блокируется вся таблица (хотя на практике не обязательно блокируется вся таблица; в данном примере без потери общности это предположение делается для простоты рассмотрения). Кроме того предполагается, что параллельно исполняются две транзакции А и В.

 

На рис. под названием каждой транзакции приводятся операторы SQL этой транзакции с условным обозначением времени выдачи этих операторов.

В момент времени 01 транзакция А обновляет таблицу ТОВАР. Таблица оказывается заблокированной.

В момент времени 03 выполняется вставка в таблицу ОТДЕЛЕНИЕ. В результате эта таблица также блокируется.

Затем делается вставка в таблицу ТОВАР. При этом таблица остается заблокированной.

В момент 09 транзакция А заканчивается выдачей оператора COMMIT и таблицы ТОВАР и ОТДЕЛЕНИЕ разблокируются.

Транзакция В в момент 02 обновляет таблицу ЗАКАЗ, вследствие чего эта таблица блокируется. В момент 04 делается попытка вставки в таблицу ОТДЕЛЕНИЕ, но ранее эта таблица заблокирована транзакцией А, поэтому транзакция В не получает к ней доступа и оказывается в состоянии ожидания . Транзакция В находится в состоянии ожидания до момента 09. когда транзакция А разблокирует таблицу ОТДЕЛЕНИЕ . Таблица разблокируется со стороны транзакции А но тут же блокируется со стороны транзакции В и транзакция В продолжает свою работу, т.е. исполняет оператор вставки. В момент 11 транзакция В завершается и разблокирует таблицы ОТДЕЛЕНИЕ и ЗАКАЗ.

Таким образом, захват таблицы одной из транзакций приводит к задержке другой (других) транзакции, если она обращается к той же таблице. Задержанная транзакция переходит в состояние ожидания. Причем она будет находиться в состоя­нии ожидания до тех пор, пока не будет снята блокировка, заданная другой транзакцией.

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

В начале данного раздела мы сделали допущение, что блокируются все таблицы целиком. Блокируемые информационные объекты могут быть разными или, как иногда говорят, разным может быть уровень блокирования (степень дробления блокировок ):

1. блокирование всей БД.

2. блокирование отдельных таблиц БД.

3. блокирование набора кортежей ( страниц).

4. блокирование отдельных кортежей.

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

Очевидно, что чем меньше информационный объект по своим размерам, тем выше параллелизм в работе транзакций, так как вероятность конфликта между разными транзакциями уменьшается. Недостатком, как уже было отмечено, является рост накладных расходов системы.

Чаще всего блокирование выполняется на уровне отдельных кортежей.

 

Различают 2 типа блокировок:

1) блокировки без взаимного доступа ( Х-блокировки или монопольные блокировки, или блокировки записи),

2) блокировки с возможностью взаимного доступа (S-блокировки или разделяемые блокировки, или блокировки чтения).

 

Рассмотрим правила блокирования:

 

1. Если транзакция А блокирует некоторый кортеж p без возможности совместного доступа (Х-блокировка), то запрос другой транзакции В с блокировкой этого кортежа будет отменен. Т.е. транзакция В не сможет установить блокировку.

2. Если транзакция А блокирует кортеж p с возможностью взаимного доступа (S-блокировка), то возможны 2 случая:

А) запрос со стороны транзакции В на Х-блокировку этого же кортежа будет отвергнут;

Б) запрос со стороны транзакции В на S-блокировку этого же кортежа будет принят ( т.е. транзакция В сможет установить S-блокировку на кортеж p).

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

 

Эти правила можно формально описать с помощью матрицы совместимости, представленной в табл. 1:

 

Матрица совмес­тимости для Х- и S-блокировки Таблица 1

 

  X S -
X N N Y
S N Y Y
- Y Y Y

 

Матрицу совместимости можно интерпретировать следующим образом. Рассмотрим некоторый кортеж р и предположим, что транзакция А блокирует кортеж р различными типами блокировки (это обозначено соответствующими символами S и X, а отсутствие блокировки — прочерком). Предположим также, что некоторая транзакция В запраши­вает блокировку кортежа, что обозначено в первом слева столбце матрицы (для полноты картины, в таблице также приведен случай "отсутствия блокировки"). Вдругих ячейках матрицы символ N обозначает конфликтную ситуацию (запрос со стороны транзакции В не может быть удовлетворен, и сама эта транзакция переходит в состояние ожидания), a Y — полную совместимость (запрос со стороны транзакции B удовлетворен).

Большинство современных СУБД устанавливает блокировки автоматически, т.е. неявным образом: например, запрос на "извлечение кортежа" является неявным запросом с S-блокировкой, а за­прос на "обновление кортежа" — неявным запросом с Х-блокировкой соответствующего кортежа. При этом под термином "обновление" подразумеваются помимо самих операций обновления также операции вставки и удаления.

В большинстве случаев блокировки устанавливаются применительно к кортежам.

Но такой механизм неявного блокирования иногда может быть не удобен для пользователя и системы. Поэтому система может устанавливать блокировки и применительно к отдельным таблицам (например, в случае, когда таблица очень интенсивно используется какой-то транзакцией), и применительно к отдельным страницам базы данных или ко всей базе данных.

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

Некоторые СУБД обеспечивают возможность явного (преднамеренного в полном смысле этого слова) задания блокировок с помощью разного рода операторов типа LOCK.

Например, оператор LOCK поддерживается системами DB2 и ORACLE. Однако следует иметь в виду, что этот оператор не является оператором языка SQL! Поэтому удобное в некотором смысле средство может быть серьезным орудием, понижающим эффективность разрабатываемой информационной системы (в случае, когда программисты злоупотребляют использованием указанного оператора).

 

Лекция 8