【问题标题】:Deadlock on Two Phase Locking transaction两阶段锁定交易的死锁
【发布时间】:2017-04-19 07:07:52
【问题描述】:

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

【问题讨论】:

    标签: database transactions locking deadlock


    【解决方案1】:

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

    即使 T2 进程“升级其在 X 上的读锁”,它仍然不会对 T1 应该发生什么产生任何影响:它仍然应该开始等待直到 X 上的 T2 锁定被释放了。

    所以我们仍然让 T1 等待 T2,并且我们仍然让 T2不得不在 T2 尝试获取其对 Y 的锁定时开始等待 T1。

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

    编辑

    如果您引入与 T1 和 T2 都对话的第三个组件“锁管理器”,也许会更容易理解这个问题。此 Locks Manager 组件经历的状态依次为“无锁”、“T1 在 Y 上持有的读锁”、“T1 在 Y 上持有的读锁和 T2 在 X 上持有的读锁”。

    后一位首先强制锁管理器拒绝 T1 在 X 上的锁请求,前一位随后迫使锁管理器拒绝 T2 在 Y 上的锁请求。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-07-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-08
      • 1970-01-01
      • 2015-03-18
      相关资源
      最近更新 更多