В СУБД, основанных на архитектуре «клиент–сервер», наиболее
распространен подход, реализующий соблюдение протокола двухфазного
блокирования объектов БД. Перед выполнением любой операции над
объектом БД от имени транзакции запрашивается захват объекта в
совместном или монопольном режиме. Выполнение транзакции разбивается
на две фазы:
фаза роста – накопление захватов (установление блокировок);
фаза фиксации или отката – освобождение захватов (снятие
блокировок).
Реализуемость транзакций гарантируется, если блокировки, относящиеся
к одновременно выполняемым транзакциям, удовлетворяют правилу: «Ни
одна блокировка от имени какой-либо транзакции не должна
устанавливаться, пока не будет снята ранее установленная блокировка».
В реляционных БД объектами для захвата могут быть:
файл – физический (с точки зрения БД) объект, область хранения
нескольких отношений и индексов;
таблица – логический объект, соответствующий множеству записей
данного отношения;
страница данных – физический объект, хранящий записи одного или
нескольких отношений, индексную или служебную информацию;
запись – элементарный физический объект БД.
Блокировка на уровне поля не реализована, поскольку приводит к
перегрузке менеджера блокировок и к падению производительности системы.
Выбор вида блокировки и объекта зависит от того, какая операция
выполняется, как много таких операций, каковы ограничения по времени
обработки. Например, если осуществляется массовая корректировка файла,
то лучше открыть его в эксклюзивном режиме, чем последовательно
блокировать каждую запись.
Очевидно, что чем крупнее объект захвата, тем меньше захватов будет
поддерживаться в системе и на это будут тратиться меньшие накладные
расходы. Если выбрать в качестве уровня объектов для захватов файл или
отношение, то будет решена даже проблема фантомных вставок.
Однако при использовании для захватов крупных объектов возрастает
вероятность конфликтов транзакций и уменьшается возможность их
параллельного выполнения. При укрупнении объекта захвата мы умышленно
огрубляем ситуацию и видим конфликты в тех ситуациях, когда на самом
деле конфликтов нет.