3

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

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

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

锁定正确的UPDLOCK行并阻塞其他进程,但我们时不时地得到一个重复的 id。在行被锁定之前,局部变量似乎被赋予了当前值。我曾假设在处理语句的选择部分之前会获得锁。

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

如果需要其他信息,请告诉我。或者,如果我正在做一些明显愚蠢的事情,那么该信息也是受欢迎的。

4

2 回答 2

2

SQL Server 文档中UPDLOCK

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

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

尝试XLOCK改用,这也会锁定其他读数。

于 2013-09-26T20:33:05.050 回答
0

我认为问题在于您的锁定仅在此选择期间被持有。因此,一旦您的存储过程具有值,它就会释放锁,然后再继续更新 id(或插入新行或其他)。

这意味着并行运行的另一个查询能够查询相同的值,然后更新/插入同一行。

你应该在你的'with'语句中添加一个HOLDLOCK,这样锁就可以保持更长时间。

这在这个答案中得到了很好的处理

于 2016-08-03T15:12:33.587 回答