- 数据库机制
死锁是指两个或两个以上的进程在执行过程中,因争夺资源而造成的一种互相等待的现象
InnoDB会自动检测一个事务的死锁并回滚一个或多个事务来防止死锁。Innodb会选择代价比较小的事务回滚
- 案例
1:update mk_user set name ='1' where `name`='idis12';:
2:update mk_user set name='12' where id=12;
3:update mk_user set name='1' where id=(select id from mk_user where name='idis12' );
`id` 主键索引 `name` index 索引 `age` 普通字段
1:会优先使用`name`索引,因为name不是主键索引,还会用到主键索引:;
2:是首先使用主键索引,再使用name索引
大量并发会出现死锁,通常使用3代替1
- 死锁分类
- 同一表更新等where条件,使用主键和非主键索引之间的交叉,在高并发下导致死锁
- insert…T_1 Select ...t_2 和 delete...t2 之间导致的共享锁和独占锁之间的死锁
- https://www.cnblogs.com/phpfans/p/4649883.html
- 避免方法
使用独占锁的事务,操作应尽量简单,避免一次占用太多资源或者表等
更新或者删除等操作,sql的where条件应都是主键或都是索引,避免交叉,防止死锁
定时任务等定时脚本,避免同一时间点,多个对同一表的读写操作
- 条件
- 四个条件
环路等待条件
请求和保持条件
互斥条件
不剥夺条件
-
- 概述
在进程环路{P0,P1}中,该线程持有资源p0,并请求资源p1,并在环路完成之前不释放资源p0;
而同时在环路{P1,P0},则正好相反;两个线程互斥请求资源,同时不释放各自的资源