Аномалия сериализации на уровне изоляции repeatable read

Дана таблица:

CREATE TABLE archaeologists (
    archaeologist_id SERIAL PRIMARY KEY,
    full_name VARCHAR,
    salary FLOAT,
    specialization VARCHAR,
    qualification VARCHAR
);

И есть транзакции в двух разных сессиях, которые выполняются параллельно

-- Session 1:
SET TRANSACTION ISOLATION LEVEL REPEATABLE READ;
BEGIN;

COMMIT;

-- Session 2:
SET TRANSACTION ISOLATION LEVEL REPEATABLE READ;
BEGIN;

COMMIT;

Как можно создать аномалию сериализации, чтобы Postgres её пропустил?


Ответы (1 шт):

Автор решения: Akina

Аномалия сериализации - это когда результат выполнения параллельных транзакций отличается от такового при их последовательном выполнении.

-- session 1                               session 2
CREATE TABLE t (x INT, z INT);
INSERT INTO t (z,x) VALUES (1,11),(2,22);
BEGIN;                                  
                                           BEGIN;
SELECT MAX(x) FROM t WHERE z=1;          
                                           SELECT MAX(x) FROM t WHERE z=2;
INSERT INTO t(z,x) VALUES (2,222);
                                           INSERT INTO t(z,x) VALUES (1,111);
COMMIT;
                                           COMMIT;

При указанном порядке выполнения первая транзакция выведет 11, вторая 22. Тогда как при последовательном - вторая транзакция выведет 222.

Это - только общая демонстрация идеи. Просто в коммент не помещается.

→ Ссылка