#sql #postgresql #transaction-isolation
Вопрос:
В настоящее время я пишу статью о различных уровнях изоляции транзакций и хочу показать грязное чтение / неповторяемое чтение / фантомное чтение.
Грязные чтения невозможно показать, так как в PostgreSQL нет READ_UNCOMMITTED, у меня есть пример неповторяемого чтения. Тем не менее, я изо всех сил пытаюсь найти пример для фантомного чтения.
В качестве примера я создаю это:
CREATE TABLE balances (id varchar PRIMARY KEY, balance int);
INSERT INTO balances (id, balance) VALUES ('Alice', 40), ('Bob', 50);
Затем у меня есть два терминала (T1 и T2), с помощью которых я подключаюсь к базе данных для этого:
T1$ start transaction isolation level repeatable read;
T1$ SELECT * FROM balances WHERE balance > 10;
id | balance
---------- ---------
Alice | 40
Bob | 50
T2$ INSERT INTO balances (id, balance) VALUES ('Charlie', 60);
T1$ SELECT * FROM balances WHERE balance > 10;
id | balance
---------- ---------
Alice | 40
Bob | 50
Почему это не дает фантомного чтения? Я думал, что последний T1-запрос должен показать Чарли, но это не так. Я думал, что это будет иметь место только с уровнем изоляции СЕРИАЛИЗУЕМЫХ транзакций. Предотвращает ли ПОВТОРЯЕМОЕ чтение также фантомное чтение в PostgreSQL?
Ответ №1:
В Postgres 12 уровень изоляции транзакций REPEATABLE_READ предотвращает фантомное чтение (источник).