Подготовка к экспериментам
create table test (
col1 int primary key,
col2 int not null
);
insert into test values (1, 10), (2, 20);
В первом соединении выполняю
set session transaction isolation level repeatable read;
start transaction;
select * from test;
update test set col2 = col2 + 10 where col1 = 1;
select * from test;
Во втором соединении выполняю
set session transaction isolation level repeatable read;
start transaction;
select * from test;
update test set col2 = col2 + 20 where col1 = 1; /* Ждем */
Возвращаюсь к первому соединению и выполняю commit;
. После этого update
во втором соединении выполнился.
ВОПРОС: Получается, что update
во втором соединении учел изменения из другой транзакции, т.е поменял снимок?
Провожу далее этот же эксперимент в PostgreSQL.
В первом соединении выполняю
START TRANSACTION ISOLATION LEVEL REPEATABLE READ;
select * from test;
update test set col2 = col2 + 10 where col1 = 1;
select * from test;
Во втором соединении выполняю
START TRANSACTION ISOLATION LEVEL REPEATABLE READ;
select * from test;
update test set col2 = col2 + 20 where col1 = 1; /* Ждем */
select * from test;
Возвращаюсь к первому соединению и выполняю commit;
. После этого update
во втором соединении вывалился с ошибкой(оно и понятно, снимок то менять нельзя):
ОШИБКА: не удалось сериализовать доступ из-за параллельного изменения.