我发出以下查询并应用了UPDLOCK

select @local_var = Column
from table (UPDLOCK)
where OtherColumn = @parameter


发生的事情是多个连接命中了该例程,该例程在存储过程内用于计算唯一的ID。一旦获得锁,我们将计算下一个ID,更新行中的值并提交。这样做是因为客户端对其系统中的某些对象ID具有特定的格式要求。

UPDLOCK锁定正确的行并阻止其他进程,但是我们时不时地得到一个重复的ID。在行被锁定之前,似乎已为局部变量提供了当前值。我假设在处理语句的选择部分之前将获得锁定。

我正在使用SQLServer 2012,并且隔离级别设置为读取已提交。

如果需要其他信息,请告诉我。或者,如果我做的事情显然很愚蠢,也欢迎您提供这些信息。

最佳答案

SQL Server documentation on UPDLOCK


在读取表时使用更新锁而不是共享锁,并保持锁直到语句或事务结束。 UPDLOCK的优点是允许您读取数据(而不阻塞其他读取器)并在以后进行更新,以确保自上次读取以来数据没有更改。


这意味着其他进程仍可以读取值。

尝试使用XLOCK代替,这也会锁定其他读数。

关于sql-server - SQLServer何时在Select中应用UPDLOCK,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/19032878/

10-11 07:47