事务调度死锁判定:给定T1、T2、T3调度是否存在死锁?
事务调度死锁判定咨询
我认为以下事务调度存在死锁(T3等待T1解锁Y),但无法在事务T1、T2、T3之间形成等待环。现咨询:该调度是否存在死锁?
事务调度时间线(按执行顺序)
| T1 | T2 | T3 |
|---|---|---|
read_lock(X); | ||
read_item(X); | ||
read_lock(X); | ||
read_lock(Y); | ||
read_item(Y); | ||
read_item(X); | ||
unlock(X); | ||
write_lock(X); | ||
write_lock(Y); | ||
read_item(Y); | ||
write_lock(Y); | ||
read_item(Y); | ||
unlock(Y); | ||
write_item(Y); | ||
unlock(Y); | ||
unlock(X); | write_item(Y); | |
unlock(X); | ||
unlock(Y); |
(格式化说明:假设T3执行read_item(Y)早于T2执行write_lock(Y);保留原图中T1执行unlock(X)与T3执行write_item(Y)同时发生的设定)
死锁判定分析
死锁的发生需要同时满足四个必要条件:互斥访问资源、占有且等待、不可抢占、循环等待。我们逐一梳理调度中的锁持有与等待关系:
锁持有状态与等待关系梳理
- T3先获取X的读锁(
read_lock(X)),之后申请Y的写锁(write_lock(Y)),此时Y被T1持有读锁,因此T3等待T1释放Y。 - T1先获取Y的读锁(
read_lock(Y)),之后申请X的写锁(write_lock(X)),此时X被T3持有读锁,因此T1等待T3释放X。 - T2的X锁已释放,申请Y的写锁时被T1的读锁阻塞,但T2未持有任何其他锁,也没有其他事务等待T2的资源。
- T3先获取X的读锁(
死锁条件验证
- 互斥:X的写锁与读锁互斥,Y的写锁与读锁互斥,满足互斥条件。
- 占有且等待:T1持有Y的读锁并等待X的写锁;T3持有X的读锁并等待Y的写锁,满足占有且等待条件。
- 不可抢占:锁资源无法被强制抢占,只能由持有事务主动释放,满足不可抢占条件。
- 循环等待:T1等待T3,T3等待T1,形成T1 ↔ T3的循环等待环,满足循环等待条件。
结论
该调度存在死锁,死锁发生在T1与T3之间。虽然T2也处于阻塞状态,但它不在死锁循环中,不影响死锁的判定——只要系统中存在一组事务形成循环等待环,就会发生死锁。
内容的提问来源于stack exchange,提问作者Cláudio Vitor Dantas
相关产品推荐
相关产品推荐

