【问题标题】:How do I lock out writes to a specific table while several queries execute?如何在执行多个查询时锁定对特定表的写入?
【发布时间】:2018-06-14 22:27:53
【问题描述】:

我在我的 sql 服务器中设置了一个表,用于跟踪已更改的库存项目(在另一个数据库中)。该表由几个不同的触发器提供。每 15 分钟,一个计划任务运行一个批处理文件,该批处理文件执行许多不同的查询,这些查询发送有关此表中标记的项目的更新,以更新多个电子商务网站。批处理文件中的最后一个查询重置标志。

您可以想象,如果在此批处理文件运行时标记了某个项目,则可能会丢失更改。我通过每 24 小时重播最近 25 小时的更新来解决这个问题,以防万一发生这种情况。它有效,但 IMO 有点笨拙。

我想要做的是延迟对该表的任何写入,直到我的脚本完成,并重置脚本启动时标记的所有行上的标志。然后让所有这些延迟写入发生。

我已经考虑过使用表提示 (TABLOCK) 来执行此操作,但这似乎仅限于一个查询——除非我误解了我所读到的内容,这当然是可能的。我有几个连续运行。 TIA。

【问题讨论】:

    标签: sql sql-server sql-server-2012


    【解决方案1】:

    亚历克斯 您是否可以将脚本修改为存储过程,该存储过程使用将锁定应用于生产表的选择语句将所有数据提取到临时表中。然后,您可以将锁放在主表上,并在远离实时系统的临时表(或为此目的而构建的永久表)中进行所有处理。它会慢很多,并且会给你的 SQL 框增加更多负载,但如果你有它的时间点快照,速度应该不是问题。

    如果该选项不适用,那么也许您可以将整个事物包装在事务中,并使用第一个 select 语句在您的生产表上加一个表锁。

    祝你好运

    【讨论】:

    • 感谢 Gerald,这听起来像是一个可行的计划。我可以将所有标记的记录选择到临时表中,并在下一步中重置标记。这样做是瞬间完成的,几乎不可能有胭脂字进入。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-11
    • 1970-01-01
    • 1970-01-01
    • 2018-08-03
    • 2021-12-19
    相关资源
    最近更新 更多