SQL - 更新导致死锁错误

时间:2012-11-02 10:40:43

标签: sql sql-server sql-server-2008 tsql

我正在尝试在查看页面时更新表中的行(它会增加查看的计数),但是现在我得到一个死锁错误,我猜这是由于两个或更多人尝试更新同一行?

错误是:

Transaction (Process ID 60) was deadlocked on lock | communication buffer resources with another process and has been chosen as the deadlock victim. Rerun the transaction.

我的SQL是:

UPDATE [ProductDescription] 
SET [ViewCount] = ([ViewCount] + 1) 
WHERE ProductCode = @prodCode 
    AND ApplicationID = @AppID

我相信我可能需要一个WITH(NOLOCK)?

3 个答案:

答案 0 :(得分:0)

你不需要NOLOCK。这只会删除读锁定,并会导致不可预测的结果。最好的做法是在update语句中使用TABLOCK,这意味着在完成之前其他进程无法访问该表。

答案 1 :(得分:-1)

将事务隔离级别设置为SERIALIZABLE或SNAPSHOT以正确更新数据。有关详细信息,请检查HERE

答案 2 :(得分:-1)

问题更可能是由用户同时运行选择引起的。默认隔离级别为“read committed”,导致锁定。

除非您正在阅读的数据是最新的至关重要,否则请考虑使用:

with(nolock)

在选择或替代隔离级别。