gpt4 book ai didi

sql-server - TABLOCK、HOLDLOCK 是否足以阻止 INSERT?

转载 作者:行者123 更新时间:2023-12-04 02:53:52 24 4
gpt4 key购买 nike

我有一个包含多个表的事务。在从 EDITED_TABLE 中删除了一些记录后,我需要防止插入到 TABLE_TO_BE_LOCKED。目前我正在使用 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? .但是,结果是不要这样做以防止主键重复。

最佳答案

如果表在一个事务中有写入,那么独占锁将被持有直到事务结束。在这种情况下,您无法启用 SELECT,除非您在 SELECT 上使用 NOLOCK,但您会看到已删除的行。

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

听起来您正在尝试修复您选择的解决方案:有了更多信息,我们也许能够提供一个更好的解决方案,它可以在没有锁定提示的情况下执行您想要的操作。例如,如果您的事务需要一个不受其他执行插入操作影响的已删除数据的一致 View ,那么您可以尝试一种或多种

  • 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

关于sql-server - TABLOCK、HOLDLOCK 是否足以阻止 INSERT?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17081911/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com