这两天遇到一个死锁的问题,两个程序同时使用 delete 删除两张表,A 程序使用的是T1 LEFT JOIN T2
,B 程序使用的是T2 INNER JOIN T1
。此时会出现死锁。
因为两个程序的 SQL 连结表的时候,T1 、T2 表的顺序不同,所以尝试把 B 程序T2 INNER JOIN T1
调整成T1 INNER JOIN T2
,依然会出现死锁。
最后把 B 程序也改成 LEFT JOIN:T1 LEFT JOIN T2
,多次尝试后没有发生死锁。但是如果把 B 程序改成T2 LEFT JOIN T1
的话,会非常容易发生死锁。
而且SHOW ENGINE INNODB STATUS
查看死锁信息信息的时候明确可以看到是record lock
。
所以我想问的是,是不是T1 LEFT JOIN T2
的时候,会优先把 T1 里的所有 record 锁上,然后再锁 T2 里的 record 。
但是T1 INNER JOIN T2
的时候,顺序就不一定了。
我猜测的是:
有人知道是不是这么回事吗?
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.