死锁的产生
避免死锁
既然存在死锁,那么如何避免死锁呢?
避免死锁
上图讲解了死锁的原因:数据库的操作不是原子性操作,所以有了各种锁,像gap,表锁行锁。
- 使用SHOW ENGINE INNODB STATUS来查看死锁的原因,一般是最后死锁的原因
- 第二个框框告诉你,死锁并不可怕,因为innodb会检测死锁进行相应的回滚。
- 保持交易小,持续时间短,对于一些占用长时间的请求要进行相应的优化。
- 可以使用rc级别的mysql事务隔离级别,在上面的链接也解释了rr和rc的区别以及相关的影响,主要rc是取消了gap锁,当进行范围查询(没有命中唯一索引的时候,rc级别会释放不命中的行数,从而减少死锁的可行性)
- 更第4点很像,让mysql命中更精确,更少的行数,从获取更少的锁,减少死锁的可能性。
- 减少锁定,比如for update这种表锁级别。