我有一个包含几个表的交易。从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?。但是有结果不要这样做以防止主键中的重复。
答案 0 :(得分:4)
如果表在事务中有写入,则将保留独占锁,直到事务结束。除非您在SELECT上使用NOLOCK,否则在这种情况下无法启用SELECT,但随后您将看到已删除的行。
TABLOCK, HOLDLOCK
将完全锁定整个表,直到事务结束
听起来您正在尝试修复您选择的解决方案:有了更多信息,我们可能会提供更好的信息,无需锁定提示即可满足您的需求。例如,如果您的交易需要一致的未删除数据视图,而该数据不受其他执行INSERTS的交易的影响,那么您可以尝试其中一个或多个
评论后......
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