【发布时间】:2019-06-15 07:09:52
【问题描述】:
我以为我知道这个问题的答案,但这个 answer 让我怀疑。
以如下时间表为例:
r1(x) r2(x) w1(x) w2(x )
会发生死锁吗? 我的推理是,是的,它可能会发生,因为事务 1 和事务 2 将在资源 x 上具有共享锁,因此不允许任何一个事务继续写入。
那么我是正确的还是我添加的链接中的响应正确?
【问题讨论】:
标签: database deadlock theory database-deadlocks
我以为我知道这个问题的答案,但这个 answer 让我怀疑。
以如下时间表为例:
r1(x) r2(x) w1(x) w2(x )
会发生死锁吗? 我的推理是,是的,它可能会发生,因为事务 1 和事务 2 将在资源 x 上具有共享锁,因此不允许任何一个事务继续写入。
那么我是正确的还是我添加的链接中的响应正确?
【问题讨论】:
标签: database deadlock theory database-deadlocks
问题归结为您如何定义“资源”。在您的示例中,两个线程正在读取和写入一个对象 X。如果对象 X 只有一种类型的锁,那么线程 2 在读取时将无法获取它,不会出现死锁。
同样,如果只有写入需要锁(因此不能保证可重复读取),那么线程 2 的写入只会破坏线程 1 的写入。同样,没有死锁。
但在您的示例中,针对一个对象有两种锁。这里的“资源”就是锁,有两种:共享读锁和独占写锁。
这就是为什么提前获取锁是个好主意。如果两个线程都尝试获取写锁(只是一个“资源”),而不是先获取读锁,然后将其提升为写锁,那么就不会有任何争用。
【讨论】: