我面临一个问题,可能很容易解决,我只是新的高级事务设置。
每隔30分钟,我就会运行一个INSERT查询,该查询将从链接服务器到客户端服务器获取最新数据,并发送到我们可以调用的表ImportTable。为此,我有一份简单的工作,如下所示:
BEGIN TRAN
DELETE FROM ImportTable
INSERT INTO ImportTable (columns)
SELECT (columns)
FROM QueryGettingResultsFromLinkedServer
COMMIT问题是,每次作业运行时,ImportTable都被锁定为查询运行时(2-5分钟),没有人能够读取记录。我希望这个表能一直被读取,尽可能少的停机时间。
现在,我读到可能允许SNAPSHOT ISOLATION在数据库设置中解决我的问题(目前设置为FALSE ),但我从未使用过不同的事务隔离类型,而且由于这不是我的DB,而是我的客户端的,如果我不确定它是否会破坏某些东西,我宁愿不修改任何数据库设置。
我知道我可以有一个中间表,把记录插入到最后的表格中,然后再插入到最后的表格中,这当然是一个可能的解决办法,我只是希望在这个过程中能有更复杂的东西,并学习一些新的东西。
PS:我的客户端服务器和数据库是很新的,很少使用,所以如果我改变一些设置的话,我希望影响很小,但是我仍然不能为了学习的目的随机地改变各种设置。
非常感谢!
发布于 2015-06-14 17:51:33
你让这件事变得更难了
问题是,您让它成为事务的一部分的时间是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
发布于 2015-06-14 16:34:28
插入通常不会阻塞表,除非它升级为表level.In --在这种情况下,您首先删除表并再次插入数据,为什么不只插入已更新的data?.for --您使用的是事务级(Rsci)快照隔离--但是行版本的附加影响,这意味着sql将存储在tempdb中更改的行的行版本。
请参阅MCM隔离视频金伯利特里普的深入了解,也不要忘记测试在舞台环境。
https://stackoverflow.com/questions/30828019
复制相似问题