【问题标题】:Is it possible to generate a deadlock between only 2 transactions and 1 resource?是否可以仅在 2 个事务和 1 个资源之间生成死锁?
【发布时间】:2019-06-15 07:09:52
【问题描述】:

我以为我知道这个问题的答案,但这个 answer 让我怀疑。

以如下时间表为例:

r1(x) r2(x) w1(x) w2(x )

会发生死锁吗? 我的推理是,是的,它可能会发生,因为事务 1 和事务 2 将在资源 x 上具有共享锁,因此不允许任何一个事务继续写入。

那么我是正确的还是我添加的链接中的响应正确?

【问题讨论】:

    标签: database deadlock theory database-deadlocks


    【解决方案1】:

    问题归结为您如何定义“资源”。在您的示例中,两个线程正在读取和写入一个对象 X。如果对象 X 只有一种类型的锁,那么线程 2 在读取时将无法获取它,不会出现死锁。

    同样,如果只有写入需要锁(因此不能保证可重复读取),那么线程 2 的写入只会破坏线程 1 的写入。同样,没有死锁。

    但在您的示例中,针对一个对象有两种锁。这里的“资源”就是锁,有两种:共享读锁和独占写锁。

    这就是为什么提前获取锁是个好主意。如果两个线程都尝试获取写锁(只是一个“资源”),而不是先获取读锁,然后将其提升为写锁,那么就不会有任何争用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-09
      • 2013-12-13
      • 1970-01-01
      相关资源
      最近更新 更多