为什么这条语句表会被锁?

2021-01-15 14:44:06 +08:00
 cirton

insert into a 表 select * from b 表 where not exists ( select 1 from c 表 where .... );

执行这条语句,发现 c 表 被锁了?

为什么一张查询的关联表会被锁呢?

数据引擎是 innodb

2026 次点击
所在节点    MySQL
4 条回复
luoyou1014
2021-01-15 16:07:54 +08:00
C 表不锁,B 表会出现幻读。
cirton
2021-01-15 16:22:57 +08:00
@luoyou1014 可以在更新 a 表时不锁 c 表吗?
现在更新 a 表时,c 表就会被锁导致业务暂停。对 mysql 不太熟,一般怎么处理这种情况呢?
qiayue
2021-01-15 16:29:40 +08:00
不要用一条语句完成这个业务,用程序来完成
512357301
2021-04-21 09:13:15 +08:00
@cirton c 表不锁的话,如果 c 表在语句执行中更新了怎么办,以更新前为准还是更新后为准
还有就是尽量不要在 where 中用子查询,我个人比较反感这种写法,有些场景下执行效率低,写起来也麻烦,唯一的好处就是语句逻辑比较直观

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

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

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

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

© 2021 V2EX