【问题不成立】mysql 多个进程下连续的多个insert为什么会出现死锁

发布于 2022-09-11 14:26:49 字数 394 浏览 22 评论 0

很抱歉,问题有误,已在回答做出说明

出现的情景是这样的,有一个脚本task,开启了多个进程

这些进程会同时操作多个表(对这些表的操作都只有insert,但是对于一个表可能insert多次),从操作第一个表开始就开启一个事务,操作完最后一个表后提交事务,比如

table1
table2
table3
table4

操作这些表的顺序是一定的,只能从上到下,但是操作的数目不确定(比如进程1操作1、4,进程2操作2、4)

使用的存储引擎是innodb

mysql报错信息是
Deadlock found when trying to get lock; try restarting transactionin
错误号1213

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

流云如水 2022-09-18 14:26:49

我来自己回答了,算是个乌龙吧。。

提问中没有发现两个问题影响了分析:

1.对表的操作不仅是insert 还有update,使用的是insert ... on duplicate update ..
2.不能从锁表的角度来考虑(并不是考虑一种更严格的情况就是对的,反而死锁往往都是细粒度的造成)

出现的场景是:

进程1和进程2循环操作table1,由于对于table1可能有多次insert/update操作,所以存在可能:

进程1对行的锁要求是:1->2->3
进程2对行的锁要求是:3->2->1

出现这种反向的锁要求,很明显是会造成死锁了

总之,用事务得多想想场景,然后尽量精简一点

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文