Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 如何编写SQL来更新和消除死锁?_Sql Server_Deadlock_Dirtyread - Fatal编程技术网

Sql server 如何编写SQL来更新和消除死锁?

Sql 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

我需要经常执行这个SQL

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锁定数据的级别。还要注意,我们选择的隔离级别越严格,保持数据处于正确状态的锁定级别就越高。和相关的。