2012-01-23 86 views

回答

2

因为死锁可能几乎只有当您使用行级锁定发生。死锁的最基本的例子是:

  • 事务A是更新行1,2,3
  • 事务B被更新行3,2,1
  • A修改行1,打开(锁)第2行,并为行等待3
  • 乙锁排3,和排等待2

由于A有2个,需要3,和B有3个,需要2,他们将永远等待,除非查询引擎捕获它,这是造成死锁的原因。基本上这是一个无限的等待逻辑循环被取消。

当您使用TABLOCK(指示引擎使用表锁定而不是行锁定)时,事务A将等待整个表可用(如果B已将其打开),或者将锁定在整个表(如果可用的话),阻止任何其他事务修改表,直到它完成。

+0

当我们tablockx它是正确的sql服务器对表应用锁,但例如一些另一个事务试图获得同一资源的tablockx然后事务必须等待,但它应该有一些限制时,sql服务器处理或抛出例外情况是这个资源已经获得了独占表锁,导致了另一个事务的死锁 – stackflow532

+0

如果你首先使用'TABLOCK'来避免死锁,为什么你会希望它在等待时间太长时抛出一个死锁错误?此外,这与发布的问题无关。如果您有功能请求在Microsoft Connect上发布它。 – JNK

+0

对不起,你误会了,我不会抛出一个死锁错误,我只想知道另一个事务将等待多久,只要获得锁定的初始事务将释放锁定。 – stackflow532