是否可以仅在2个事务和1个资源之间生成死锁?

时间:2019-06-15 07:09:52

标签: database deadlock theory database-deadlocks

我以为我知道这个问题的答案,但是这个answer给我带来了疑问。

以下面的时间表为例:

r 1 (x)r 2 (x)w 1 (x)w 2 (x )

会发生死锁吗? 我的理由是,可能会发生这种情况,因为事务1和事务2将在资源x上具有共享锁,因此不允许任何一个事务继续其写操作。

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

1 个答案:

答案 0 :(得分:0)

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

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

但是在您的示例中,针对一个对象有两种类型的锁。这里的“资源”是锁,其中有两个:可共享的读锁和排他的写锁。

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