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