两阶段锁定事务的死锁

Deadlock on Two Phase Locking transaction

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

T1 和 T2 是完全不同的进程,完全不知道彼此,因此它们应该 是。

即使 T2 进程 "upgrade its read lock on X" 它仍然不会对 T1 应该发生什么产生任何影响:它仍然应该开始等待直到 T2 锁定在 X 上发布。

因此我们仍然有 T1 在等待 T2,并且我们仍然有 T2 必须 在 T2 尝试获取其对 Y 的锁定时开始等待 T1。

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

编辑

如果您绘制与 T1 和 T2 通信的第三个组件 "Locks Manager",或许理解问题会更容易一些。此 Locks Manager 组件经历的状态依次为 "No locks"、"Read lock held by T1 on Y"、"Read lock held by T1 on Y and Read lock held by T2 on X".

后一位强制锁管理器首先拒绝T1对X的锁请求,前一位强制锁管理器拒绝T2对Y的锁请求