什么是死锁?
好比是两个事务都在等待对方释放锁,之后进行下一步操作,但是最后双方都没有释放资源,所以导致一直处于等待的状态。
但是服务器不会让死锁的状态一直持续,会关闭其中一个影响较小的事务(右边的事务关闭),
参考链接:死锁面试题(什么是死锁,产生死锁的原因及必要条件)-CSDN博客
怎么查看有没有发生死锁呢?
查询是否锁表
show OPEN TABLES where In_use > 0;
查看当前的事务
SELECT * FROM INFORMATION_SCHEMA.INNODB_TRX;
查看当前锁定的事务
SELECT * FROM INFORMATION_SCHEMA.INNODB_LOCKS;
查看当前等锁的事务
ELECT * FROM INFORMATION_SCHEMA.INNODB_LOCK_WAITS;
减少死锁:
- 使用事务,不使用 lock tables 。
- 保证没有长事务。
- 尽量基于primary或unique key更新数据
- 操作完之后立即提交事务,特别是在交互式命令行中。
- 如果在用 (SELECT ... FOR UPDATE or SELECT ... LOCK IN SHARE MODE),尝试降低隔离级别。注意:select ... for update (表级锁)、select ... lock in share mode(行级锁)
- 修改多个表或者多个行的时候,将修改的顺序保持一致。
- 创建索引,可以使创建的锁更少。
- 最好不要用 (SELECT ... FOR UPDATE or SELECT ... LOCK IN SHARE MODE)。
- 如果上述都无法解决问题,那么尝试使用 lock tables t1, t2, t3 锁多张表
- 使用乐观锁和减少锁的粒度,保证一致的锁定顺序,合计设计索引,避免大事务。
- 等待超时时,回滚事务或者结束进程。
MySQL死锁的解决方案
彻底搞懂MySQL死锁_mysql deadlock-CSDN博客
面试必问!MySQL死锁是什么,如何解决?史上最全!-CSDN博客