Sql server 如何编写SQL来更新和消除死锁?
我需要经常执行这个SQLSql server 如何编写SQL来更新和消除死锁?,sql-server,deadlock,dirtyread,Sql Server,Deadlock,Dirtyread,我需要经常执行这个SQL UPDATE Users SET UserPoint=UserPoint+(@UserPoint) WHERE UserID=@UserID 我可以允许脏读或脏写,但我不想看到死锁,有没有办法最大限度地避免死锁 编辑 好吧,@Tomtome这可能不是僵局,这对我来说是个好消息 这里我跟进一个新的问题,希望你能帮忙 我还需要读取数据,所以我使用 SELECT UserPoint FROM [Users] WITH (NOLOCK) WHERE UserID=@UserI
UPDATE Users SET UserPoint=UserPoint+(@UserPoint) WHERE UserID=@UserID
我可以允许脏读或脏写,但我不想看到死锁,有没有办法最大限度地避免死锁
编辑
好吧,@Tomtome这可能不是僵局,这对我来说是个好消息
这里我跟进一个新的问题,希望你能帮忙
我还需要读取数据,所以我使用
SELECT UserPoint FROM [Users] WITH (NOLOCK) WHERE UserID=@UserID
这不是一个事务,只是一个简单的单行SQL,我已经使用了nolock
,如果我允许脏读,我是否需要使用设置事务隔离级别来避免死锁
EIDT再次
我认为将隔离级别设置为readuncommitted和WITH NOLOCK是一样的。就这样。
谢谢大家,
有没有办法最大限度地避免僵局
否,因为此语句不能死锁
死锁要求至少持有两个锁(A和b)。因此,一个进程得到锁A,等待B,另一个进程得到B,等待A,而等待并不能解决任何问题。如果上面的语句遇到锁,它将等待(可能超时),但不会死锁
除非它是包含更多语句的更大事务的一部分
因此,这个问题从一开始就不存在;) 你为什么要死锁?你不是只更新了一行吗?可能还有其他东西在更新同一行吗?我不想假设是这样的:userID有唯一索引还是主索引?它是聚集索引的一部分吗?是的,UserID位于聚集索引中。每个人更新同一行的机会很大。Eric,如果你有一个单独的后续问题,请在单独的问题中提问。否则它可能不会引起太多的注意,因为这一点已经得到了回答。摘自上面文章:如果表上有聚集索引,那么就有一个键锁,而不是行锁。在较低级别上锁定会增加并发性,但如果使用大量锁,则会消耗更多内存,反之亦然。因此,粒度只是指SQL Server锁定数据的级别。还要注意,我们选择的隔离级别越严格,保持数据处于正确状态的锁定级别就越高。和相关的。