我发出以下查询并应用了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/