insert mysql 死锁_mysql insert死锁问题

以前一直不明白,为啥多个insert并发会导致deadlock问题,直到读了官方文档15.7.3 Locks Set by Different SQL Statements in InnoDB​dev.mysql.com

这里记录一下:update和delete都2一样的策略

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

5. replace和insert一样

6.

优化性能和死锁问题的思路:尽量将热点行的操作延后

控制并发度,加队列

你可能感兴趣的:(insert,mysql,死锁)