0

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

错误是:

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)?

4

3 回答 3

0

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

于 2012-11-02T10:45:44.703 回答
-1

该问题更有可能是由同时运行选择的用户引起的。默认隔离级别是“已提交读”,这会导致锁定。

除非您正在阅读的数据必须是最新的,否则请考虑使用:

with(nolock)

在选择或替代隔离级别。

于 2012-11-02T10:47:23.563 回答
-1

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

于 2012-11-02T10:43:34.953 回答