导读:引发死锁的原因是什么?如何避免?本文详细介绍了和死锁有关的知识点|mysql事务并发机制详解( 三 )


文章图片
死锁案例二
导读:引发死锁的原因是什么?如何避免?本文详细介绍了和死锁有关的知识点|mysql事务并发机制详解
文章图片
25和26记录都不存在 , A和B并没有更新任何记录 , 但是由于数据库隔离级别为RR , 所以会在(20,30)之间加上间隙锁 。 之后A和B分别执行INSERT要插入25和26 , 需要在(20,30)之间加插入意向锁 , 插入意向锁和间隙锁冲突 , 所以两个事务互相等待 , 最后形成死锁 。
死锁案例三
导读:引发死锁的原因是什么?如何避免?本文详细介绍了和死锁有关的知识点|mysql事务并发机制详解
文章图片
加锁是一条记录一条记录挨个加锁 , 如果两条SQL语句的加锁顺序不一样 , 也可能会导致死锁 。 A的加锁顺序为:id=20->30 , B的加锁顺序为:id=30->20 , 正好相反 , 所以会导致死锁 。
死锁案例四
REPLACEINTO和INSERTONDUPLICATEUPDATE 。
这两个语句虽然原子化“存在则更新 , 不存在则插入”的语义 , 但在MySQL内部还是被拆为多个操作步骤 , 且在某些版本(5.7)会引入GAP锁来保证数据完整性 , 从而导致高并发情况下产生死锁 。
导读:引发死锁的原因是什么?如何避免?本文详细介绍了和死锁有关的知识点|mysql事务并发机制详解】作者丨子富