首页 > 解决方案 > 如何在执行多个查询时锁定对特定表的写入?

问题描述

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

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

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

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

标签: sqlsql-serversql-server-2012

解决方案


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

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

祝你好运队友


推荐阅读