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