我需要帮助才能理解为什么tablockx在多线程应用程序中确实存在死锁。
我尝试使用SqlQueryStress的tablockx将多个线程仍然没有任何死锁
答案 0 :(得分:2)
因为死锁几乎只会在使用行级锁定时发生。死锁最基本的例子是:
由于A有2并且需要3,而B有3并需要2,它们将永远等待,除非查询引擎捕获它,这是导致死锁的原因。基本上它是一个无限的逻辑循环等待被取消。
当你使用TABLOCK
表示引擎使用表锁定而不是行锁定时,如果B已经打开它,或者放置一个,那么事务A将等待整个表可用。如果可用,则锁定整个表,阻止任何其他事务修改表,直到它完成。