SQLServer何时在Select中应用UPDLOCK

时间:2013-09-26 15:48:52

标签: sql-server locking

我发布了以下UPDLOCK已应用的查询:

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

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

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

我正在使用SQLServer 2012,隔离级别设置为read committed。

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

2 个答案:

答案 0 :(得分:2)

来自SQL Server documentation on UPDLOCK

  

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

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

请尝试使用XLOCK,这也会锁定其他读取。

答案 1 :(得分:0)

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

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

你应该在你的'with'语句中添加一个HOLDLOCK,这样锁就会持续一段时间。

这在Answer

中得到了很好的对待