如何编写SQL更新和无效死锁?

时间:2011-12-23 10:17:10

标签: sql-server deadlock dirtyread

我需要经常执行此SQL

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

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

修改

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

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

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

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

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

EIDT AGAIN

我认为SET ISOLATION LEVEL无法阅读并且与NOLOCK相同。完成了。 谢谢大家,

1 个答案:

答案 0 :(得分:3)

  

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

不,因为这句话不能死锁。

死锁需要两个锁定(a和b)作为最小值。因此,一个进程获得锁A,等待B,另一个进程获得B,等待A - 等待没有任何东西可以解决。如果上述语句遇到锁定,它将等待(并可能超时),但不会死锁。

除非它是包含更多陈述的大型交易的一部分。

因此,问题不存在;)