2015-04-01 130 views
0

有一个导致死锁错误的更新查询,我不知道为什么。在更新查询中已经使用了(rowlock,updlock)提示,但它仍然会导致死锁错误。导致死锁错误的SQL查询

示例查询:

update table a with (rowlock, updlock) 
set a.column1 = value 

此相同的查询,其中可以同时称为几个存储过程中使用。但是,由于指定了锁定,如果它仍然导致死锁

+0

我想你知道死锁不会因为1个查询而发生吗?您至少需要2次并且未提交的交易 – 2015-04-01 04:59:02

+0

您必须提供更多上下文才能获得帮助。也许添加一些代码片段。 – 2015-04-01 04:59:41

+0

我已更新帖子。这个查询在几个可能导致死锁的地方使用。所以请协助。 – 2015-04-01 05:06:28

回答

0

Deadlock发生在两个或多个任务永久阻塞彼此时,每个任务锁定其他任务尝试锁定的资源。

由于您明确指定with (rowlock, updlock),它会在交易时添加锁定。最后,当一个事务正在执行时,它会在表上放置一个锁。如果另一个事务要访问同一条记录,则必须等到前一个事务完成并删除锁才能继续。

使用with NOLOCK可让您绕过锁定,但在更新的情况下,这太冒险了。更如此,正如你所提到的,几个更新可以同时执行。

就你而言,似乎锁是罪魁祸首。但是,锁并不是死锁的唯一来源。它可能是内存问题或线程执行。这LINK可能会帮助您找出死锁的真正原因。