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

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

出现的情景是这样的,有一个脚本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

阅读 2.5k
1 个回答

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

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

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

出现的场景是:

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

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

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

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

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题