Как видно из анализа поведения транзакций, при использовании протокола доступа к данным не решается проблема фантомов. Это происходит оттого, что были рассмотрены только блокировки на уровне строк. Можно рассматривать блокировки и других объектов базы данных:
Кроме того, можно блокировать индексы, заголовки таблиц или другие объекты.
Чем крупнее объект блокировки, тем меньше возможностей для параллельной работы. Достоинством блокировок крупных объектов является уменьшение накладных расходов системы и решение проблем, не решаемых с использованием блокировок менее крупных объектов. Например, использование монопольной блокировки на уровне таблицы, очевидно, решает проблему фантомов.
Современные СУБД, как правило, поддерживают минимальный уровень блокировки на уровне строк или страниц. (В старых версиях настольной СУБД Paradox поддерживалась блокировка на уровне отдельных полей.).
При использовании блокировок объектов разной величины возникает проблема обнаружения уже наложенных блокировок. Если транзакция A пытается заблокировать таблицу, то необходимо иметь информацию, не наложены ли уже блокировки на уровне строк этой таблицы, несовместимые с блокировкой таблицы. Для решения этой проблемы используется протокол преднамеренных блокировок, являющийся расширением протокола доступа к данным. Суть этого протокола в том, что перед тем, как наложить блокировку на объект (например, на строку таблицы), необходимо наложить специальную преднамеренную блокировку (блокировку намерения) на объекты, в состав которых входит блокируемый объект - на таблицу, содержащую строку, на файл, содержащий таблицу, на базу данных, содержащую файл. Тогда наличие преднамеренной блокировки таблицы будет свидетельствовать о наличии блокировки строк таблицы и для другой транзакции, пытающейся блокировать целую таблицу не нужно проверять наличие блокировок отдельных строк.
Более точно, вводятся следующие новые типы блокировок:
| Транзакция B пытается наложить на таблицу блокировку: | |||||
| Транзакция A наложила на таблицу блокировку: | IS | S | IX | SIX | X |
| IS | Да|||||
| S | Да|||||
| IX | Да|||||
| SIX | Да|||||
| X | Нет

| S-блокировка таблицы (с целью потом блокировать строки) - успешна | ![]() |
--- |
S-блокировка строк, удовлетворяющих условию ![]() (Заблокировано n строк) |
![]() |
--- |
Выборка строк, удовлетворяющих условию ![]() (Отобрано n строк) |
![]() |
--- |
| --- | ![]() |
IX-блокировка таблицы (с целью потом вставлять строки) - отвергается из-за конфликта с S-блокировкой, наложенной транзакцией A |
| --- | ![]() |
Ожидание… |
| --- | ![]() |
Ожидание… |
S-блокировка строк, удовлетворяющих условию ![]() (Заблокировано n строк) |
![]() |
Ожидание… |
Выборка строк, удовлетворяющих условию ![]() (Отобрано n строк) |
![]() |
Ожидание… |
| Фиксация транзакции - блокировки снимаются | ![]() |
Ожидание… |
| --- | ![]() |
IX-блокировка таблицы (с целью потом вставлять строки) - успешна |
| --- | ![]() |
Вставка новой строки, удовлетворяющей условию ![]() |
| --- | ![]() |
Фиксация транзакции |