数据库未经证实的死锁t-sql 2005

时间:2012-07-18 17:30:14

标签: sql-server database tsql sql-server-2005

例如,存在表A和表B,我需要处理A中的更新然后B和我决定在使用期间对它们进行表锁定(如我的架构师所要求的)。同时,调用另一个过程,该表锁定B,然后锁定A.

这笔交易会完成吗?我感觉它是一个僵局,非常肯定它,因为它没有释放任何资源......

2 个答案:

答案 0 :(得分:1)

是的,这可能是一个僵局。

死锁场景是

你的任务锁定了A
其他任务锁B

然后 你的任务试图锁定B,但它不能锁定 和 其他任务试图锁定A,但它不能像你拥有它一样。

因此,其中一个任务必须失败/回滚,以便另一个完成。根据使用的RDBMS,db将选择其中一个终止。

解决方案通常是指导您必须在所有流程中以相同的顺序锁定资源,通常必须手动强制执行。

答案 1 :(得分:1)

是。这种方法将以经典的循环死锁结束,如here

所述

使用TABLE级别锁定进行更新是一种过度杀伤。这样做的理由是什么?如果您具有正确的索引,则将在密钥级别获取锁定,这有助于多个进程同时访问相关表。

最佳做法是尽可能以相同的顺序访问表格。