回答
在 MySQL 中,由于锁等待超时和死锁检测技术,出现死锁的频率不高。但一旦发生死锁会导致事务延迟或失败、系统吞吐量下降,最终影响用户体验性。线上环境应该尽量避免死锁,具体如下:
1、避免大事务。大事务占用资源时间长,会增加与其他事务发生冲突的可能,确保事务规模小且持续时间短。事务大小由 insert、update、delete 的行数决定。
2、保持一致性的锁定顺序。事务间的锁定顺序不一致,很容易出现资源互相依赖从而发生死锁。
3、及时提交事务。变更操作完成后立即提交事务,避免长时间打开交互式会话,InnoDB 事务自动提交(autocommit = 1)默认开启。
4、更改事务隔离级别。在读多写少的场景,可以更改事务隔离级别为 Read Commited,相较于 Repeatable Read 会降低锁冲突。
5、索引优化。添加合适的索引以扫描更少的行记录和加更少的锁。
避免死锁的原则是减少锁定的行记录,降低锁冲突。