Mysql死锁问题

2019/12/19

Deadlock found when trying to get lock 死锁问题报错

死锁原因

两个或两个以上事务,资源竞争相互等待。

Innodb死锁检测

在innodb中,参数innodb_lock_wait_timeout用来设置超时时间。

innodb还提供了wait-for graph算法来主动进行死锁检测,每当加锁请求无法立即满足需要并进入等待时,wait-for graph算法都会被触发,

检查是否出现环路,出现环路就是死锁。

死锁常见原因

1.出现循环等待锁情况。
2.相同表记录行锁冲突
3.不同索引锁冲突

这种情况比较隐晦,事务A在执行时,除了在二级索引加锁外,还会在聚簇索引上加锁,在聚簇索引上加锁的顺序是[1,4,2,3,5],而事务B执行时,只在聚簇索引上加锁,加锁顺序是[1,2,3,4,5],这样就造成了死锁的可能性。

4.gap锁冲突

如何避免死锁

1.以固定顺序访问表和行

2.大事务拆小

3.在同一事物尽可能一次锁定所有资源

4.降低隔离级别,有RR调整为RC,可以避免gap锁造成的死锁

5.为表添加合理的索引,防止行锁变为表锁

如何定位死锁成因

1.通过日志找出对应SQL

2.确定隔离级别

3.执行下show InnoDB STATUS看看最近死锁的日志。

参考:

[mysql死锁问题分析](https://www.cnblogs.com/tartis/p/9366574.html)

Post Directory