UPDLOCK没有避免死锁的原因..?

时间:2015-08-16 18:32:34

标签: sql-server-2008

我在google上读到可以使用UPDLOCK表提示来管理死锁。但是下面的场景并没有避免死锁: -

              -----session 1------------
set transaction isolation level repeatable read

begin transaction
select * from c with (updlock)

                -----session 2------------

set transaction isolation level repeatable read
declare @var int = 1

begin transaction
select * from c

现在当我们回到会话1并发出更新查询时,我们将在会话2中遇到死锁。它是如何避免死锁然后没有使用updlock的。我们应该使用tablockX提示,而不允许任何类型的锁。

              -----session 1------------
update c
set name = 'qwert'
where id = 1

我发现了另一个奇怪的观察结果。如果我将第一个会话中的隔离级别更改为serializable,那么updlock可以工作并避免死锁。所以我的理解是 -

  1. 只有在选择了可序列化隔离级别时,Updlock才能避免死锁。
  2. 当使用serializable以外的隔离级别时,允许来自其他会话的共享锁,这会导致死锁。在这种情况下我们应该使用tablockx。
  3. 当使用可序列化隔离时,不允许来自其他会话的共享锁,这有助于避免死锁。
  4. 有人能在这里帮助我,我很困惑

0 个答案:

没有答案