mysql死锁 - nonohony/learn GitHub Wiki

无论悲观锁还是乐观锁,都是用来防止并发,不能解决死锁问题。

一般来说业务开发不必过度考虑死锁问题,有数据库兜底。

参考:https://dev.mysql.com/doc/refman/8.0/en/innodb-deadlock-detection.html

-- 获取锁等待时间
show variables like 'innodb_lock_wait_timeout'
-- 死锁检测开关
show variables like 'innodb_deadlock_detect'

innodb死锁处理建议

参考:https://dev.mysql.com/doc/refman/8.0/en/innodb-deadlocks-handling.html

  • 通过 SHOW ENGINE INNODB STATUS 定位死锁
  • 打印死锁日志 enabling the innodb_print_all_deadlocks
  • 业务保证可重试,死锁会快速失败
  • 短事务,较小碰撞机会
  • 修改后尽快提交事务
  • 使用SELECT FOR UPDATE时,事务隔离级别可降为READ_COMMITTED
  • 保证表操作的顺序,尽量封装用业务逻辑,避免直接操作insert update delete
  • 优化索引,涉及尽量少的行,减少冲突
  • 用一张表仅一行记录当做semaphore使用,每个事务开始时更新此行,保证事务顺序执行