死锁
2020-05-09 本文已影响0人
lsh的学习笔记
什么是死锁?
指两个或两个以上的事务在执行过程中,因争夺锁资源而造成的一种互相等待的现象。若无外力作用,事务都将无法推进下去。
怎样解决?
第一种方法
解决死锁问题最简单的方式是不要有等待
,将任何的等待都转化为回滚,并且事务重新开始。
缺陷
毫无疑问,这的确可以避免死锁问题的产生。然而在线上环境中,这可能导致并发性能的下降,甚至任何一个事务都不能进行。而这所带来的问题远比死锁问题更为严重,因为这很难被发现并且浪费资源。
第二种方法
解决死锁问题最简单的一种方法是超时
,即当两个事务互相等待时,当一个等待时间超过设置的某一阈值时,其中一个事务进行回滚,另一个等待的事务就能继续进行。
第三种方法
当前数据库还都普遍采用wait-for-graph(等待图)
的方式来进行死锁检测。较之超时的解决方案,这是一种更为主动的死锁检测方式。InnoDB存储引擎也采用的这种方式。
在每个事务请求锁并发生等待时都会判断是否存在回路,若存在则有死锁,通常来说InnoDB存储引擎选择回滚undo量最小的事务
。
死锁的概率
从纯数学
的概率角度
来分析
,死锁发生的概率是非常小
的。
事务发生死锁的概率与以下几点因素有关:
- 系统中事务的数量(n),数量越多发生死锁的概率越大。
- 每个事务操作的数量(r),每个事务操作的数量越多,发生死锁的概率越大。
- 操作数据的集合(R),越小则发生死锁的概率越大。
几种死锁示例
1. AB-BA死锁
A等待B,B在等待A,这种死锁问题被称为AB-BA死锁。

回滚undo-log量最小
的事务B。
2. 例2

回滚的是undo-log记录大
的事务,这与AB-BA死锁的处理方式又有所不同。