11. Особенности реализации блокировок в субд Oracle
Основными принципами блокирования данных в СУБД Oracle являются следующие:
система блокирует данные на уровне строк и только при их изменении. Эскалация блокировок до уровня блока или таблицы не предусмотрена;
при выполнении операции считывания данные никогда не блокируются; транзакция, записывающая данные, никогда не блокирует операции чтения, ыполняемые другими транзакциями;
транзакция записи блокируется только при условии блокирования другой анзакцией записи тех строк, которые предполагает изменить текущая транзакция.
СУБД Oracle позволяет реализовать два метода блокирования - пессимистический и оптимистический.
Пессимистический метод предполагает обязательное блокирование строки перед ее изменением. Это достигается за счет применения оператора SELECT... FOR UPDATE.
Оптимистический метод основан на предположении, что изменения данных в промежутке между считыванием и началом обновления не произошло, и блокирование производится непосредственно при выполнении оператора изменения данных UPDATE.
Пример. Логическая структура базы данных sklad включает атрибуты: naim - наименование товара; col - количество товара определенного наименования на складе.
К этой БД производят одновременный доступ сотрудники отдела материально-технического снабжения. Необходимо, используя оптимистический и пессимистический методы, разработать варианты транзакции, которая осуществляет уменьшение количества пачек бумаги на складе на величину, равную 5 единицам.
Вариант 1. Концептуальное представление транзакции на основе оптимистического подхода (рис. 6.8).
SELECT sklad. naim, sklad.col UPDATE sklad
FROM sklad SET sklad. col = newcol
WHERE sklad.naim = 'БУМАГА'; WHERE sklad.naim = 'БУМАГА'
{Обработка транзакции: вводится переменная oldcol = sklad.col, вводится переменная newcol = sklad.col - 5, проверяется условие newcol>0}
AND sklad.col = oldcol; {Снятие блокировки UNLOCK sklad)
{Проверка успешности обновления, если нет - повторение транзакции}
{Установка блокировки вручную оператором
LOCK sklad либо автоматически сервером }
Рис. 6.8. Реализация оптимистического подхода
Приведенное представление указывает на принципиальные особенности структуры транзакции, базирующейся на использовании оптимистического метода. Эти особенности заключаются в следующем:
при выполнении оператора SELECT, который, по существу, предназначается для подготовки данных, необходимых для реализации оператора обновления данных UPDA ТЕ, блокировка не устанавливается;
в теле транзакции хранится старое значение oldcol изменяемой переменной;
блокировка устанавливается автоматически либо вручную оператором LOCK только при выполнении оператора UPDA ТЕ;
обновление данных произойдет только в том случае, если текущее значение обновляемого атрибута sklad.col совпадет с его старым значением, которое было получено при выполнении оператора SELECT и сохранено в переменной oldcol.
Вариант 2. Концептуальное представление транзакции, реализующей пессимистический подход (рис. 6.9).
{Установка вручную с помощью оператора
LOCK блокировки либо использование
оператора SELECT ... FOR UPDATE,
выполнение которого приведет
к автоматической блокировке}
SELECT sklad.naim, sklad.col FROM sklad
WHERE sklad.naim = 'БУМАГА' FOR UPDATE;
{Обработка транзакции:
вводится переменная newcol = skladcol - 5,
проверяется условие newcol>0}
UPDATE sklad
SET sklad.col = newcol
WHERE sklad.naim = 'БУМАГА';
{Снятие блокировки UNLOCK sklad}
{Проверка успешности обновления не требуется)
Рис. 6.9. Реализация пессимистического подхода
Блокировки, поддерживаемые СУБД Oracle, делятся на следующие пять классов:
блокировки языка манипулирования данными. Они включают блокировки строк данных или блокировки на уровне таблицы, относящиеся ко всем строкам таблицы;
блокировки языка описания данных, используемые для защиты определений структур объектов;
внутренние блокировки, применяемые СУБД Oracle для защиты определенных структур памяти, в частности буферного кэша и библиотечного кэша;
распределенные блокировки, используемые СУБД для согласования ресурсов машин, входящих в кластер;
блокировки параллельного управления кэшем.