为什么TABLOCKX没有死锁

时间:2012-01-23 16:04:18

标签: sql sql-server

我需要帮助才能理解为什么tablockx在多线程应用程序中确实存在死锁。

我尝试使用SqlQueryStress的tablockx将多个线程仍然没有任何死锁

1 个答案:

答案 0 :(得分:2)

因为死锁几乎只会在使用行级锁定时发生。死锁最基本的例子是:

  • 交易A正在更新第1,2,3行
  • 交易B正在更新第3,2,1行
  • A修改第1行,打开(锁定)第2行,然后等待第3行
  • B锁定第3行,等待第2行

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

当你使用TABLOCK表示引擎使用表锁定而不是行锁定时,如果B已经打开它,或者放置一个,那么事务A将等待整个表可用。如果可用,则锁定整个表,阻止任何其他事务修改表,直到它完成。