SQL 事务 - 允许在提交前读取原始数据(快照?)

SQL Transactions - allow read original data before commit (snapshot?)

我遇到了一个问题,可能很容易解决,我只是高级交易设置的新手。

我每 30 分钟 运行 宁一个 INSERT 查询从链接服务器获取最新数据到我客户的服务器,到 table 我们可以调用 导入表。为此,我有一个简单的工作,看起来像这样:

BEGIN TRAN
     DELETE FROM  ImportTable

     INSERT INTO ImportTable (columns)
          SELECT (columns)
          FROM QueryGettingResultsFromLinkedServer
COMMIT

事情是,每次作业 运行s ImportTable 被锁定查询 运行 时间(2-5 分钟)并且没有人可以读取记录。 我希望 table 始终可以读取,停机时间尽可能少。

现在,我读到可以在数据库设置中允许 SNAPSHOT ISOLATION 可能会解决我的问题(目前设置为 FALSE),但我从来没有玩过不同的事务隔离类型,因为这不是我的数据库而是我客户的,如果我不确定它是否会破坏某些东西,我宁愿不更改任何数据库设置。

我知道我可以有一个中间人 table 记录被插入然后插入到最终 table 这当然是一个可能的解决方案,我只是希望有更复杂的东西并在此过程中学习新东西。

PS: 我客户的服务器和数据库是相当新的,很少使用,所以如果我改变一些设置我预计影响很小,但我仍然不能为了学习目的而随意改变各种设置。

非常感谢!

插入通常不会阻塞table,除非升级到table level.In这种情况下,你先删除table再插入数据,为什么不仅插入更新的数据?对于您正在使用事务级 (rsci) 的查询,快照隔离将对您有所帮助,但您将对行版本产生额外的影响,这意味着 sql 将存储在 tempdb 中更改的行的行版本.

请看Kimberely tripp的MCM隔离视频深入了解,也不要忘记在舞台环境中进行测试。

你让事情变得更难了
问题是你让 2-5 分钟成为交易的一部分
它只有几千行 - 这部分需要几毫秒
如果您需要 ImportTable 在这几毫秒内可用,请将其放入 SnapShot

Delete ImportTableStaging;
INSERT INTO ImportTableStaging(columns)
          SELECT (columns)
          FROM QueryGettingResultsFromLinkedServer;
BEGIN TRAN
     DELETE FROM ImportTable
     INSERT INTO ImportTable (columns) with (tablock)
          SELECT (columns)
          FROM ImportTableStaging
COMMIT

如果您担心对 ImportTableStaging 的并发更新,请使用#temp