Comments 6
Фантомное чтение (phantom read). Этот феномен очень похож на неповторяющееся чтение, но здесь идет чтение нескольких строк. Первая транзакция делает выборку набора строк. После этого приходит вторая транзакция и удаляет или добавляет строки попадающие в эту выборку. Вторая транзакция фиксирует свои изменения. После этого первая транзакция снова делает ту же самую выборку и уже получает другой набор строк - их стало либо больше, либо меньше чем при первой выборке, так как вторая транзакция добавила / удалила строки.
Фантомное чтение возникает, только когда добавляются строки, попадающие под условие выборки. Дело в том, что такие строки нельзя заранее заблокировать, отсюда и разница между двумя аномалиями.
Сошлюсь на стандарт:
P3 (“Phantom”): SQL-transaction T1 reads the set of rows N that satisfy some <search condition>. SQL-transaction T2 then executes SQL-statements that generate one or more rows that satisfy the <search condition> used by SQL-transaction T1. If SQL-transaction T1 then repeats the initial read with the same <search condition>, it obtains a different collection of rows.
А удаление - это случай неповторяющегося чтения:
P2 (“Non-repeatable read”): SQL-transaction T1 reads a row. SQL-transaction T2 then modifies or deletes that row and performs a COMMIT. If T1 then attempts to reread the row, it may receive the modified value or discover that the row has been deleted.
Я думала, тут будет что-то новое, неизвестное каждому встречному, революционное открытие, что наконец постгрес научился справляться с транзакциями, а это просто глава из учебника по базам данных.
Вопрос - а почему феномены «Неповторяющееся чтение» и «Фантом» разделены? Ведь по сути в случае добавления строк также возникает «Неповторяющееся чтение»?
Транзакции в базах данных на примере PostgreSQL