我发布了以下UPDLOCK
已应用的查询:
select @local_var = Column
from table (UPDLOCK)
where OtherColumn = @parameter
会发生多个连接命中此例程,该例程在存储过程中用于计算唯一ID。锁获取后,我们计算下一个id,更新行中的值并提交。这样做是因为客户端对其系统中的某些对象ID具有特定的格式要求。
UPDLOCK
锁定正确的行并阻止其他进程,但我们偶尔会得到一个重复的id。在锁定行之前,似乎局部变量被赋予当前值。我曾假设在处理语句的选择部分之前会获得锁定。
我正在使用SQLServer 2012
,隔离级别设置为read committed。
如果需要其他信息,请告诉我。或者,如果我做的事情显然是愚蠢的,那么也欢迎这些信息。
答案 0 :(得分:2)
来自SQL Server documentation on UPDLOCK
:
在读取表时使用更新锁而不是共享锁,并保持锁直到语句或事务结束。 UPDLOCK的优点是允许您读取数据(不会阻止其他读取器)并在以后更新它,并保证自上次读取数据后数据没有发生变化。
这意味着其他进程仍然可以读取值。
请尝试使用XLOCK
,这也会锁定其他读取。
答案 1 :(得分:0)
我认为问题在于您的锁仅在此选择期间被保留。 因此,一旦您的存储过程具有值,它将释放锁定,然后继续更新ID(或插入新行或其他)。
这意味着在Parallel中运行的另一个查询能够查询相同的值,然后更新/插入同一行。
你应该在你的'with'语句中添加一个HOLDLOCK,这样锁就会持续一段时间。
这在Answer
中得到了很好的对待