3

我有一个交易,包括几张桌子。在我 TABLE_TO_BE_LOCKEDEDITED_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吗?

笔记:

我知道如何锁定表以在 sql 中插入?. 但是有结果不要这样做以防止主键中的重复。

4

1 回答 1

5

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

TABLOCK, HOLDLOCK将简单地锁定整个表,直到事务结束

听起来您正在尝试修复您选择的解决方案:通过更多信息,我们可能能够提供更好的解决方案,无需锁定提示即可满足您的需求。例如,如果您的事务需要一致的已删除数据视图,不受执行 INSERTS 的其他事务影响,那么您可以尝试以下一项或多项

  • OUTPUT 子句处理您开始使用的数据集
  • 仅使用 SERIALIZABLE 来保留范围(这是 HOLDLOCK BTW)
  • 使用SNAPSHOT 隔离模式

评论后...

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
于 2013-06-13T07:57:04.143 回答