1

我需要非常频繁地执行这个 SQL

UPDATE Users SET UserPoint=UserPoint+(@UserPoint) WHERE UserID=@UserID

我可以允许脏读或脏写,但我不想看到死锁,有没有办法最大限度地避免死锁?

编辑

好的,@Tomtome 这可能不是僵局,这对我来说是个好消息。

在这里我跟进一个新问题,希望您能提供帮助。

我还需要读取数据,所以我使用

SELECT UserPoint FROM [Users] WITH (NOLOCK) WHERE UserID=@UserID

这不是一个事务,只是一个简单的一行 SQL,而且我已经使用了,如果我允许脏读,是否nolock需要使用SET TRANSACTION ISOLATION LEVEL以避免死锁。

再次 EIDT

我认为 SET ISOLATION LEVEL 为 READ UNCOMMITTED 和 WITH NOLOCK 是一回事。所以完成了。谢谢大家,

4

1 回答 1

3

有没有办法最大限度地避免僵局?

不,因为这个语句不能死锁。

死锁至少需要两个锁(a 和 b)。因此,一个进程获得锁 A,等待 B,另一个进程获得 B,等待 A - 等待无法解决任何问题。如果上面的语句遇到锁,它将等待(并且可能超时),但不会死锁。

除非它是具有更多语句的更大事务的一部分。

所以,从一开始就不存在问题;)

于 2011-12-23T10:20:14.433 回答