2024-11-09
版权声明:本文为博主付费文章,严禁任何形式的转载和摘抄,维权必究。 本文链接:https://www.skjava.com/mianshi/baodian/detail/1837344170

回答

在 MySQL 中,由于锁等待超时和死锁检测技术,出现死锁的频率不高。但一旦发生死锁会导致事务延迟或失败、系统吞吐量下降,最终影响用户体验性。线上环境应该尽量避免死锁,具体如下:

1、避免大事务。大事务占用资源时间长,会增加与其他事务发生冲突的可能,确保事务规模小且持续时间短。事务大小由 insert、update、delete 的行数决定。

2、保持一致性的锁定顺序。事务间的锁定顺序不一致,很容易出现资源互相依赖从而发生死锁。

3、及时提交事务。变更操作完成后立即提交事务,避免长时间打开交互式会话,InnoDB 事务自动提交(autocommit = 1)默认开启。

4、更改事务隔离级别。在读多写少的场景,可以更改事务隔离级别为 Read Commited,相较于 Repeatable Read 会降低锁冲突。

5、索引优化。添加合适的索引以扫描更少的行记录和加更少的锁。

避免死锁的原则是减少锁定的行记录,降低锁冲突

扩展