Проблема со вставкой значений, извлеченных из заблокированных строк - PullRequest
0 голосов
/ 09 января 2019

У меня есть два сценария, ограниченных транзакциями:

Первый:

START TRANSACTION;
update product set price = 70;
SELECT SLEEP(20);
rollback;

Второй:

START TRANSACTION;
insert into product_order(product_id, amount, price) select id, amount, price from product;
commit;

Вторая транзакция начала выполняться, когда первая находится в состоянии сна.

Итак, я ожидал, что вторая будет выполнена во время сна первой транзакции. Неожиданно вторая транзакция ожидает, пока первая не выйдет из состояния сна. Я знаю, что это связано с блокировкой строк. Но я не обновил строки, включенные в первую транзакцию.

Мой вопрос: в чем причина такого поведения и как я могу от него избавиться?

1 Ответ

0 голосов
/ 09 января 2019

Похоже, что блокировка будет снята после окончания транзакции (вы не можете прочитать данные, потому что если транзакция завершится неудачно, базе данных придется вернуться к предыдущему состоянию)

Перед вставкой необходимо установить уровень изоляции транзакции сеансов, чтобы он мог читать данные, которые не были переданы:

SET SESSION TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;

START TRANSACTION;
insert into product_order(product_id, amount, price) select id, amount, price from product;
COMMIT;

SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ;
...