Как я могу заставить фантома читать в postgres?

#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 предотвращает фантомное чтение (источник).