以前一直不明白,为啥多个insert并发会导致deadlock问题,直到读了官方文档15.7.3 Locks Set by Different SQL Statements in InnoDBdev.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.
优化性能和死锁问题的思路:尽量将热点行的操作延后
控制并发度,加队列