原则之一
要分析一个死锁, 必须深入业务,了解整个事务的逻辑(闭门无法造车)
原则之二
GAP锁很复杂,为了减少GAP锁,减少GAP导致的死锁,尽量选择Read Committed隔离级别( RC + row based binlog,基本上能够解决所有问题,无需使用Repeatable Read)
适当的减少Unique索引,能够减少GAP锁导致的死锁(根据业务情况而定)
原则之三
在MySQL中,以不同索引的过滤条件, 来操作相同的记录( Update/Delete),很容易产生死锁。 (例如:如上例所示,执行计划分别走u和a索引,但是均操作了id = 3这一列,产生死锁。)
原则之四
RC隔离级别下,如果死锁中出现Next Key( Gap锁),说明表中一定存在unique索引多语句事务产生的死锁,确保每条语句操作记录的顺序性,能够极大减少死锁