posts - 297,  comments - 15,  trackbacks - 0
一、活锁 
如果事务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的并发控制子系统一旦检测到系统中存在死锁,就要设法解除。通常采用的方法是选择
一个处理死锁代价最小的事务,将其撤消,释放此事务持有的所有的锁,使其它事务得以继续
运行下去。当然,对撤消的事务所执行的数据修改操作必须加以恢复。
posted on 2012-06-08 17:15 chatler 阅读(1037) 评论(0)  编辑 收藏 引用 所属分类: OS

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理


<2024年11月>
272829303112
3456789
10111213141516
17181920212223
24252627282930
1234567

常用链接

留言簿(10)

随笔分类(307)

随笔档案(297)

algorithm

Books_Free_Online

C++

database

Linux

Linux shell

linux socket

misce

  • cloudward
  • 感觉这个博客还是不错,虽然做的东西和我不大相关,觉得看看还是有好处的

network

OSS

  • Google Android
  • Android is a software stack for mobile devices that includes an operating system, middleware and key applications. This early look at the Android SDK provides the tools and APIs necessary to begin developing applications on the Android platform using the Java programming language.
  • os161 file list

overall

搜索

  •  

最新评论

阅读排行榜

评论排行榜