SQL Server是否为子查询保留UPDLOCK?

时间:2014-12-14 23:30:41

标签: sql-server

我们正在尝试确定执行某些数据库操作的更有效方法。

我们遇到的一个问题是古老的主键系统,其中通过在表中找到MAX值然后加1来选择新记录的主键(我们无法更改此实现,请不要以此为答案。

我们可以采取一些不同的方法来解决这个问题(表值参数,临时表等),但我们永远不能假设另一个进程在此过程和业务规则中不会插入另一条记录不允许我们锁定桌子。

所以,我的问题的关键是,如果我们使用MAX提示在子查询中获取当前UPDLOCK值,那么锁定提示会在包含查询的生命周期中持续吗?

例如:

INSERT 
  INTO table1 
     ( PKColumn, 
       DataColumn1, 
       DataColumn2 )
VALUES SELECT MAX(ISNULL(PKColumn, 0) + 1) FROM table1 WITH (UPDLOCK)) + RowNumber ,
       DataColumn1 ,
       DataColumn2 
  FROM @Table1Temp

如果我们使用它来插入100,000条记录,例如,UPDLOCK提示是否会保留在表上,直到插入所有记录或者在检索到初始值后立即释放它?

1 个答案:

答案 0 :(得分:2)

  

指定要采取并保持更新锁,直到   交易完成。 UPDLOCK为读取操作获取更新锁   仅限于行级或页面级别。如果UPDLOCK与   TABLOCK或表级锁定是出于其他原因,a   取而代之的是(X)锁定。

是的。该交易将至少与该声明一样长。 (如果您没有使用自动提交事务并且在事务中有多个语句,则可能更长)