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使用,每个事务开始时更新此行,保证事务顺序执行