当前位置:首页 > 说编程 > 正文内容

为什么多个insert并发会导致deadlock问题?

2021-04-10说编程840

为什么多个insert并发会导致deadlock问题?

  1. SELECT ... FROM is a consistent read,无锁

  2. SELECT ... FOR UPDATE and SELECT ... FOR SHARE statements:对于唯一索引,只对需要锁定的记录上record lock,如果不是唯一索引就会加Next-key lock,同时会对不满足条件的第一个record的前面加上gap lock

  3. update和delete都一样的策略

  4. insert比较不一样

  5. replace和insert一样

  6. INSERT ... ON DUPLICATE KEY UPDATE与insert不一样,当遇到 duplicate-key时,对于primary key获取排他记录锁,对于unique index获取Next-key lock,不会死锁

这里重点说下insert:

首先,insert会对要插入的gap加insert intention gap lock,insert intention gap lock不像gap lock一样防止insert,insert intention gap lock互相之间可以共存,这样允许多个insert并发插入不同的位置

其次,对于要插入的位置会加入排他锁

多个insert并发(至少3个),当插入的位置一样的时候,比如3个session都insert table id=x,其中第一个获得排他锁,其他两个session会产生duplicate-key error,当duplicate-key error发生时,两个session都会将锁变化为共享锁,下一步获取排他锁,然后第一个session rollback了,两个session互相持有共享锁,无法获得排他锁,导致死锁。

大概过程如下:

  • s1 insert id =x 或者 s1 delete id = x

  • s2 insert id = x

  • s3 insert id = x

  • s1 rollback

  • s2和s3死锁。


扫描二维码推送至手机访问。

本站内容仅供学习研究,转载请以链接形式注明,如有侵犯请联系处理。

本文链接:https://suyu.net/post/35.html

分享给朋友:

发表评论

看不清,换一张

◎欢迎参与讨论,请在这里发表您的看法和观点。