Skip to content

Latest commit

 

History

History
18 lines (14 loc) · 1.74 KB

mysql为啥会产生死锁呢?如何避免他?.md

File metadata and controls

18 lines (14 loc) · 1.74 KB

可能产生死锁的几个原因(其实都离不开死锁的产生条件,围绕这个回答即可):

  1. 互斥条件:一个资源每次只能被一个事务使用。
  2. 占有且等待:一个事务至少已经占有一个资源,且正在等待获取其他事务持有的资源。
  3. 非强制性释放:资源只能被占有它们的事务在完成任务后才释放。
  4. 循环等待:存在一种事务之间的循环等待关系。

为了避免死锁,可以采取以下措施:

  1. 有序资源分配:确保所有事务请求资源的顺序一致,减少循环等待的可能性。例如,可以按照表名、行ID的字典序来访问数据库资源。
  2. 超时机制:设置超时时间,当事务等待特定资源超过设定时间后自动回滚,从而打破等待状态。
  3. 死锁检测与解除:MySQL InnoDB 存储引擎提供了自动的死锁检测和处理机制,当检测到死锁时,会自动回滚事务中的某些操作来解除死锁。
  4. 尽量使用行级锁:行级锁比较细粒度,相对于表级锁而言,发生死锁的几率较小。
  5. 减少事务大小和持续时间:尽量避免长事务,因为它们更容易与其他事务发生资源竞争。确保数据库操作尽可能快地执行,并提交事务。
  6. 避免不必要的锁定:仅在必要时对数据进行锁定,减少不必要的SELECT FOR UPDATE或LOCK IN SHARE MODE。
  7. 使用低隔离级别:如果业务逻辑允许,可以考虑将事务的隔离级别设置得更低一些,降低隔离级别会减少加锁的范围。
  8. 优化查询逻辑:优化 SQL 查询语句,减少锁竞争,比如通过建立合适的索引来加速查询,从而减少锁定资源的时间。