推荐链接:
总结——》【Java】
总结——》【Mysql】
总结——》【Redis】
总结——》【Kafka】
总结——》【Spring】
总结——》【SpringBoot】
总结——》【MyBatis、MyBatis-Plus】
总结——》【Linux】
总结——》【MongoDB】
总结——》【Elasticsearch】
一、概念
单线程:不会发生死锁
单资源:不会发生死锁
死锁是指两个或两个以上的进程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去。此时称系统处于死锁状态或系统产生了死锁。
二、死锁的条件
- 多操作者(M>=2)争夺多个资源(N>=2且N<=M)
- 争夺资源的顺序不一致
- 争夺者拿到资源不放手
三、查看死锁
-- 是否启用标准Innodb监视器
show variables like '%innodb_status_output%'
-- 启用标准Innodb监视器
SET GLOBAL innodb_status_output=ON;
-- 禁用标准Innodb监视器
SET GLOBAL innodb_status_output=OFF;
----------------------------------------------------
-- 是否启用锁定监视器,默认OFF
SHOW VARIABLES LIKE 'innodb_status_output_locks';
-- 启用锁定监视器,使用完毕后建议关闭,否则会影响数据库性能
SET GLOBAL innodb_status_output_locks = ON;
-- 禁用锁定监视器
SET GLOBAL innodb_status_output_locks = OFF;
----------------------------------------------------
-- 查看Innodb监视器的信息(死锁信息)
show engine innodb status;
四、解决死锁策略
1、InnoDB 通过 lockwait_timeout 来设置超时时间,一直等待直到超时
2、发起死锁检测,发现死锁之后,主动回滚死锁中的某一个事务,让其它事务继续执行。