为什么多个insert并发会导致deadlock问题?
为什么多个insert并发会导致deadlock问题?
SELECT ... FROM is a consistent read,无锁
SELECT ... FOR UPDATE and SELECT ... FOR SHARE statements:对于唯一索引,只对需要锁定的记录上record lock,如果不是唯一索引就会加Next-key lock,同时会对不满足条件的第一个record的前面加上gap lock
update和delete都一样的策略
insert比较不一样
replace和insert一样
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死锁。