插入从锁定行获取的值的问题

时间:2019-01-09 12:35:16

标签: mysql transactions locking

我有两个受交易限制的脚本:

第一个:

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 :(得分:0)

看起来锁将在事务结束后释放(您无法读取数据,因为如果事务失败,数据库将必须回滚到先前的状态)

在插入之前,您应该设置会话事务隔离级别,以便它可以读取未提交的数据:

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;