死锁

2020-05-09  本文已影响0人  lsh的学习笔记

什么是死锁?

指两个或两个以上的事务在执行过程中,因争夺锁资源而造成的一种互相等待的现象。若无外力作用,事务都将无法推进下去。

怎样解决?

第一种方法

解决死锁问题最简单的方式是不要有等待,将任何的等待都转化为回滚,并且事务重新开始。

缺陷

毫无疑问,这的确可以避免死锁问题的产生。然而在线上环境中,这可能导致并发性能的下降,甚至任何一个事务都不能进行。而这所带来的问题远比死锁问题更为严重,因为这很难被发现并且浪费资源。

第二种方法

解决死锁问题最简单的一种方法是超时,即当两个事务互相等待时,当一个等待时间超过设置的某一阈值时,其中一个事务进行回滚,另一个等待的事务就能继续进行。

第三种方法

当前数据库还都普遍采用wait-for-graph(等待图)的方式来进行死锁检测。较之超时的解决方案,这是一种更为主动的死锁检测方式。InnoDB存储引擎也采用的这种方式。

在每个事务请求锁并发生等待时都会判断是否存在回路,若存在则有死锁,通常来说InnoDB存储引擎选择回滚undo量最小的事务

死锁的概率

纯数学概率角度分析,死锁发生的概率是非常小的。

事务发生死锁的概率与以下几点因素有关:

  1. 系统中事务的数量(n),数量越多发生死锁的概率越大。
  2. 每个事务操作的数量(r),每个事务操作的数量越多,发生死锁的概率越大。
  3. 操作数据的集合(R),越小则发生死锁的概率越大。

几种死锁示例

1. AB-BA死锁

A等待B,B在等待A,这种死锁问题被称为AB-BA死锁。

1

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

2. 例2

2

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

上一篇 下一篇

猜你喜欢

热点阅读