数据库死锁解决方案

原创 2015年11月19日 15:49:37
一、活锁
如果事务T1封锁了数据R,事务T2又请求封锁R,于是T2等待。T3也请求封锁R,当T1释放了R上的封锁之后系统首先批准了T3的请求,T2仍然等待。然后T4又请求封锁R,当T3释放了R上的封锁之后系统又批准了T4的请求,...,T2有可能永远等待,这就是活锁的情形。 
避免活锁的简单方法是采用先来先服务的策略。
二、死锁
如果事务T1封锁了数据R1,T2封锁了数据R2,然后T1又请求封锁R2,因T2已封锁了R2,于是T1等待T2释放R2上的锁。接着T2又申请封锁R1,因T1已封锁了R1,T2也只能等待T1释放R1上的锁。这样就出现了T1在等待T2,而T2又在等待T1的局面,T1和T2两个事务永远不能结束,形成死锁。
1. 死锁的预防
在数据库中,产生死锁的原因是两个或多个事务都已封锁了一些数据对象,然后又都请求对已为其他事务封锁的数据对象加锁,从而出现死等待。防止死锁的发生其实就是要破坏产生死锁的条件。预防死锁通常有两种方法:
① 一次封锁法 
一次封锁法要求每个事务必须一次将所有要使用的数据全部加锁,否则就不能继续执行。
一次封锁法虽然可以有效地防止死锁的发生,但也存在问题,一次就将以后要用到的全部数据加锁,势必扩大了封锁的范围,从而降低了系统的并发度。
② 顺序封锁法 
顺序封锁法是预先对数据对象规定一个封锁顺序,所有事务都按这个顺序实行封锁。
顺序封锁法可以有效地防止死锁,但也同样存在问题。事务的封锁请求可以随着事务的执行而动态地决定,很难事先确定每一个事务要封锁哪些对象,因此也就很难按规定的顺序去施加封锁。
可见,在操作系统中广为采用的预防死锁的策略并不很适合数据库的特点,因此DBMS在解决死锁的问题上普遍采用的是诊断并解除死锁的方法。
2. 死锁的诊断与解除
① 超时法
如果一个事务的等待时间超过了规定的时限,就认为发生了死锁。超时法实现简单,但其不足也很明显。一是有可能误判死锁,事务因为其他原因使等待时间超过时限,系统会误认为发生了死锁。二是时限若设置得太长,死锁发生后不能及时发现。
② 等待图法
事务等待图是一个有向图G=(T,U)。 T为结点的集合,每个结点表示正运行的事务;U为边的集合,每条边表示事务等待的情况。若T1等待T2,则T1、T2之间划一条有向边,从T1指向T2。事务等待图动态地反映了所有事务的等待情况。并发控制子系统周期性地(比如每隔1分钟)检测事务等待图,如果发现图中存在回路,则表示系统中出现了死锁。

DBMS的并发控制子系统一旦检测到系统中存在死锁,就要设法解除。通常采用的方法是选择一个处理死锁代价最小的事务,将其撤消,释放此事务持有的所有的锁,使其它事务得以继续运行下去。当然,对撤消的事务所执行的数据修改操作必须加以恢复。

银行算法
避免死锁算法中最有代表性的算法是Dijkstra E.W 于1968年提出的银行家算法:
该算法需要检查申请者对资源的最大需求量,如果系统现存的各类资源可以满足申请者的请求,就满足申请者的请求。
这样申请者就可很快完成其计算,然后释放它占用的资源,从而保证了系统中的所有进程都能完成,所以可避免死锁的发生。








版权声明:本文为博主原创文章,未经博主允许不得转载。

数据库死锁的预防与解除

http://blog.csdn.net/imzoer/article/details/8062547 数据库死锁!! 今天面的工行,传说中的只问项目不问技术,但是被问了这么深入的问题。是RP不行啊...
  • hhhuuu2020
  • hhhuuu2020
  • 2016年04月06日 16:39
  • 942

数据库死锁-解决死锁问题的三种办法

  • 2008年12月12日 09:07
  • 84KB
  • 下载

数据库死锁分析与解决

一、死锁的表现1、错误信息是:事务(进程 ID)与另一个进程被死锁在 锁 资源上,并且已被选作死锁牺牲品。请重新运行该事务。2、错误信息是:事务(进程 ID )与另一个进程被死锁在 锁 | 通信缓冲区...
  • hexieshangwang
  • hexieshangwang
  • 2015年09月07日 11:59
  • 412436

数据库死锁的解决办法

近日在博客网站上,回复别人的数据库死锁避免问题,之前也曾经几次答复过同样的内容,觉得很有必要汇聚成一个博客文章,方便大家。 这里的办法,对所有的数据库都适用。   这个解决办法步骤如下: 1....
  • songyux6
  • songyux6
  • 2012年08月01日 17:32
  • 3398

数据库死锁及解决死锁问题

所谓死锁: 是指两个或两个以上的进程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去.此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等待的进程称为死锁进程...
  • big_bigwolf
  • big_bigwolf
  • 2015年11月14日 10:04
  • 1151

数据库死锁原因及解决办法

死锁(Deadlock)   所谓死锁:是指两个或两个以上的进程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去。此时称系统处于死锁状态或系统产生了死...
  • LemonTreey
  • LemonTreey
  • 2016年11月07日 16:31
  • 11741

数据库死锁问题

1. 死锁原理     根据操作系统中的定义:死锁是指在一组进程中的各个进程均占有不会释放的资源,但因互相申请被其他进程所站用不会释放的资源而处于的一种永久等待状态。     死锁的四个必...
  • w174504744
  • w174504744
  • 2012年09月25日 14:35
  • 8014

数据库常见死锁原因及处理

数据库和操作系统一样,是一个多用户使用的共享资源。当多个用户并发地存取数据时,在数据库中就会产生多个事务同时存取同一数据的情况。若对并发操作不加控制就可能会读取和存储不正确的数据,破坏数据库的一致性。...
  • qq_16681169
  • qq_16681169
  • 2017年07月08日 10:22
  • 4723

select查询造成的数据库死锁

     最近给一个客户更新了一个模块,查询过程中老是出现查询结果不一致的情况,有时多有时少,通过调试发现sql语句都一样,返回的结果却不一样,跟踪SQL语句发现,在查询结果少的时候,会报 事务...
  • queenpong
  • queenpong
  • 2016年03月16日 00:53
  • 5148

造成数据库表死锁的原因分析及解决方案

原文引至:http://www.blogjava.net/imdosop/archive/2008/11/06/239085.html
  • Calvex880714
  • Calvex880714
  • 2016年03月04日 14:26
  • 12762
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:数据库死锁解决方案
举报原因:
原因补充:

(最多只允许输入30个字)