LINUX.ORG.RU

REPEATABLE READ в MySQL меняет снимок?

 ,


0

4

Подготовка к экспериментам

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 во втором соединении вывалился с ошибкой(оно и понятно, снимок то менять нельзя): ОШИБКА: не удалось сериализовать доступ из-за параллельного изменения.


Интересные у вас вопросы.

Судя по интернетам - в MySQL именно UPDATE всегда ведет себя так, словно находится в READ COMMITTED. (by design)

https://stackoverflow.com/questions/59287861/repeatable-read-isolation-level-...

Поиграл в вашу игру на 10.8.4-MariaDB и PostgreSQL 14.5, всё так.

Toxo2 ★★★
()
Последнее исправление: Toxo2 (всего исправлений: 1)