两阶段锁定事务的死锁

时间:2017-04-19 07:07:53

标签: database transactions locking deadlock

两阶段锁定可以在锁定阶段升级锁定。但我不知道为什么下面的例子说T1和T2都是死锁。为什么read_lock(x)无法升级到write_lock(x)?

enter image description here

1 个答案:

答案 0 :(得分:2)

T1和T2是完全不同,完全不知道彼此的进程,所以他们应该

即使T2进程 "升级其X"它仍然不会对T1应该发生什么有任何不同:它仍然应该开始等待,直到X上的T2锁被释放。

所以我们仍然有T1等待T2,我们仍然有T2 必须开始在T2试图获取其对Y的锁定时等待T1。

所以我们仍然有两个进程等待另一个进程释放一些锁。死锁。

修改

如果您使用第三个组件" Locks Manager"那么理解这个问题可能会更容易一些。与T1和T2谈话。此锁定管理器组件所经历的状态按顺序排列"没有锁定","读取锁定在Y"上的T1;"读取由T1保持在Y上的锁定并且在X"上持有由T2持有的锁定。

后一位首先强制Lock Manager拒绝X上的T1锁定请求,而后一位随后强制Lock Manager拒绝T2上的T2锁定请求。