首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SQL事务-允许在提交之前读取原始数据(快照?)

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

Stack Overflow用户
提问于 2015-06-14 09:55:01
回答 2查看 993关注 0票数 3

我面临一个问题,可能很容易解决,我只是新的高级事务设置。

每隔30分钟,我就会运行一个INSERT查询,该查询将从链接服务器到客户端服务器获取最新数据,并发送到我们可以调用的表ImportTable。为此,我有一份简单的工作,如下所示:

代码语言:javascript
复制
BEGIN TRAN
     DELETE FROM  ImportTable

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

问题是,每次作业运行时,ImportTable都被锁定为查询运行时(2-5分钟),没有人能够读取记录。我希望这个表能一直被读取,尽可能少的停机时间。

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

我知道我可以有一个中间表,把记录插入到最后的表格中,然后再插入到最后的表格中,这当然是一个可能的解决办法,我只是希望在这个过程中能有更复杂的东西,并学习一些新的东西。

PS:我的客户端服务器和数据库是很新的,很少使用,所以如果我改变一些设置的话,我希望影响很小,但是我仍然不能为了学习的目的随机地改变各种设置。

非常感谢!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-06-14 17:51:33

你让这件事变得更难了

问题是,您让它成为事务的一部分的时间是2-5分钟。

只有几千行--这个部分需要几毫秒的时间。

如果您需要ImportTable在这几毫秒内可用,那么将其放入SnapShot中

代码语言:javascript
复制
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

票数 0
EN

Stack Overflow用户

发布于 2015-06-14 16:34:28

插入通常不会阻塞表,除非它升级为表level.In --在这种情况下,您首先删除表并再次插入数据,为什么不只插入已更新的data?.for --您使用的是事务级(Rsci)快照隔离--但是行版本的附加影响,这意味着sql将存储在tempdb中更改的行的行版本。

请参阅MCM隔离视频金伯利特里普的深入了解,也不要忘记测试在舞台环境。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30828019

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档