TABLOCK,HOLDLOCK是否足以阻止INSERT?

时间:2013-06-13 07:52:24

标签: sql-server locking

我有一个包含几个表的交易。从TABLE_TO_BE_LOCKED删除一些记录后,我需要阻止EDITED_TABLE的插入。目前我正在使用TABLOCKX

DELETE EDITED_TABLE FROM EDITED_TABLE
left join TABLE_TO_BE_LOCKED  with (TABLOCKX) on ....
 WHERE ...

我需要阻止向TABLE_TO_BE_LOCKED插入新记录,但我希望保留阅读它的可能性。在DELETE TABLE_TO_BE_LOCKED仍未更改之后,这就是显式锁定的原因。

我可以使用TABLOCK, HOLDLOCK代替TABLOCKX吗?

注意:

我知道How to lock a table for inserting in sql?。但是有结果不要这样做以防止主键中的重复。

1 个答案:

答案 0 :(得分:4)

如果表在事务中有写入,则将保留独占锁,直到事务结束。除非您在SELECT上使用NOLOCK,否则在这种情况下无法启用SELECT,但随后您将看到已删除的行。

TABLOCK, HOLDLOCK将完全锁定整个表,直到事务结束

听起来您正在尝试修复您选择的解决方案:有了更多信息,我们可能会提供更好的信息,无需锁定提示即可满足您的需求。例如,如果您的交易需要一致的未删除数据视图,而该数据不受其他执行INSERTS的交易的影响,那么您可以尝试其中一个或多个

  • OUTPUT子句用于处理您使用
  • 开始的数据集
  • 仅使用SERIALIZABLE保留范围(即HOLDLOCK BTW)
  • 使用SNAPSHOT isolation modes

评论后......

BEGIN TRAN

SELECT *
INTO #temp
FROM TABLE_TO_BE_LOCKED
WHERE .. -- or JOIN to EDITED_TABLE

DELETE EDITED_TABLE FROM EDITED_TABLE
left join #temp  with (TABLOCKX) on ....
 WHERE ...

-- do stuff with #temp

COMMIT