Mysql 事务中使用排它锁无效可能是什么原因导致的?

2022-01-29 05:47:32 +08:00
 LeeReamond

如题,开发中遇到一个问题

usd test_db ;
begin;
select * from test_table where id = 2 for update;
commit;

上述代码如果多线程同时执行的话,在前面的线程执行完之前,后面的应该是阻塞的,然而换了一台机器到测试服务器上跑以后,该库中使用相同语句却所有线程都会同时执行完毕,也就是说排他锁失效了。

想问一下这可能是什么原因导致的,以前没见过这种情况。我使用 explain 解释后确定搜索一定走的是索引(主键),所有搜索语句也都指定了条件,为什么会这样呢?

951 次点击
所在节点    问与答
3 条回复
sujin190
2022-01-29 08:59:58 +08:00
因为事务被 commit 了,事务 commit 了,你打开的排它锁自然也关闭了啊
vzyw
2022-01-29 15:21:16 +08:00
id=2 的数据是不是空的? 如果为空,两个线程都能获得排他锁,不会阻塞
LeeReamond
2022-01-31 03:01:40 +08:00
@sujin190 我为了表示这是一个事务加上了 begin 和 commit ,实际上测试锁的时候当然没有 commit

@vzyw 非空,有数据

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/831212

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX