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

vpfxa7rd  于 2021-06-15  发布在  Mysql
关注(0)|答案(1)|浏览(322)

我有两个由事务绑定的脚本:
第一个:

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;

当第一个事务处于“睡眠”状态时,第二个事务已开始执行。
所以,我预期第二个将在第一个事务的休眠期间执行。出乎意料的是,第二个事务正在等待,直到第一个事务从睡眠状态退出。我知道这和排锁有关。但是我没有更新第一个事务中包含的行。
我的问题是:这种行为的原因是什么?我怎样才能摆脱它?

xlpyo6sf

xlpyo6sf1#

看起来锁将在事务结束后释放(您无法读取数据,因为如果事务失败,数据库将不得不回滚到以前的状态)
在插入之前,应设置会话事务隔离级别,以便它可以读取未提交的数据:

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;

相关问题