死锁的发生与否,并不在于事务中有多少条SQL语句。【死锁的关键在于】:两个(或以上)的Session【加锁 的顺序】不一致。分析MySQL每条SQL语句的加锁规则,分析出每条语句的加锁顺序,然后检查多个并发SQL间是否存在以相反的顺序加锁的情况,就可以分析出各种潜在的死锁情况,也可以分析出线上死锁发生的原因。
如何避免死锁呢?
-
注意程序的逻辑
根本的原因是程序逻辑的顺序,最常见的是交差更新Transaction 1: 更新表A -> 更新表BTransaction 2: 更新表B -> 更新ATransaction获得两个资源
-
保持事务的轻量
越是轻量的事务,占有越少的锁资源,这样发生死锁的几率就越小
-
提高运行的速度
避免使用子查询,尽量使用主键等等
-
尽量快提交事务,减少持有锁的时间
越早提交事务,锁就越早释放