Неповторяемое считывание

Проблема несовместимого анализа

Транзакция A дважды читает одну и ту же строку. Между этими чтениями вклинивается транзакция B, которая изменяет значения в строке.

Транзакция A Время Транзакция B
S-блокировка - успешна ---
Чтение ---
--- X-блокировка - отвергается
--- Ожидание…
Повторное чтение Ожидание…
Фиксация транзакции (Блокировка снимается) Ожидание…
--- X-блокировка - успешна
--- Запись
--- Фиксация транзакции (Блокировка снимается)
Все правильно    

Результат. Транзакция B притормозилась до окончания транзакции A. В результате транзакция A дважды читает одни и те же данные правильно. После окончания транзакции A, транзакция B продолжила работу в обычном режиме.

Фиктивные элементы (фантомы)

Транзакция A дважды выполняет выборку строк с одним и тем же условием. Между выборками вклинивается транзакция B, которая добавляет новую строку, удовлетворяющую условию отбора.

Транзакция A Время Транзакция B
S-блокировка строк, удовлетворяющих условию . (Заблокировано n строк) ---
Выборка строк, удовлетворяющих условию . (Отобрано n строк) ---
--- Вставка новой строки, удовлетворяющей условию .
--- Фиксация транзакции
S-блокировка строк, удовлетворяющих условию . (Заблокировано n+1 строка) ---
Выборка строк, удовлетворяющих условию . (Отобрано n+1 строк) ---
Фиксация транзакции ---
Появились строки, которых раньше не было    

Результат. Блокировка на уровне строк не решила проблему появления фиктивных элементов.