jes*_*esi 5 sql-server sql-server-2008-r2 linked-server sql-server-2014
我遇到了无法理解的链接服务器的情况。
所以我们有一个从 2008R2 服务器到 2014 服务器的链接服务器。下面的示例查询是从 2008R2 服务器执行的,并且工作正常。
SET XACT_ABORT ON;
Declare @BatchSize int = 10
DELETE from LINKEDSRV.DB.DBO.Table
INSERT INTO LINKEDSRV.DB.DBO.Table (ECN)
SELECT TOP (10) C1 from LINKEDSRV.DB.DBO.Table22 --order by C1
SELECT * FROM LINKEDSRV.DB.DBO.Table
Run Code Online (Sandbox Code Playgroud)
但是当我用order by C1
它执行同样的事情时,它不会返回任何结果。
第二种情况 - 如果我替换TOP(10)
withTOP(@BatchSize)
和 noorder by
也不会得到任何结果。例如
SELECT TOP (@BatchSize) C1 from LINKEDSRV.DB.DBO.Table22
Run Code Online (Sandbox Code Playgroud)
如果我SET XACT_ABORT OFF
. 那么 XACT_ABORT 对链接服务器有任何限制吗?
编辑- 进行了更多测试,看起来它也与行数有关
可能的回购
在服务器 A 上
use testdb
go
create table t1( c1 int, c2 datetime)
create table t2( c1 int, c2 datetime)
insert into t2 select 1, GETDATE()
insert into t2 select * from t2 -- insert close to 5000 rows, I found the issue around over around 35000 rows
Run Code Online (Sandbox Code Playgroud)
在 ServerB 上
创建到 ServerA 的链接服务器
SET XACT_ABORT ON;
Declare @BatchSize int = 10
delete from ServerA.testdb.dbo.t1
insert into ServerA.testdb.dbo.t1 (c1)
select top (@BatchSize) c1 from ServerA.testdb.dbo.t2 --order by c2
select * from ServerA.testdb.dbo.t1
Run Code Online (Sandbox Code Playgroud)
没有输出。但是,如果您将表 t2 中的行数减少到 2000 左右,则效果很好。
如果我 的话,所有场景都有效
SET XACT_ABORT OFF
。那么XACT_ABORT
链接服务器有什么限制吗?
的设置XACT_ABORT
将传播到远程 SQL Server,如处理服务器到服务器远程存储过程中的错误中所述。
该设置还会影响是否可以进行更新以及如何处理更新,如分布式查询和分布式事务中所述。INSERT
允许使用,因为XACT_ABORT OFF
SQL Server 支持嵌套事务。
然而,似乎存在一个实现错误,因为在插入期间跟踪 2014 服务器上的活动表明,当 SQL Server 尝试释放架构锁时会发生错误:
此错误会中止远程服务器上的语句(尝试释放架构锁),但当XACT_ABORT
is时OFF
,远程服务器将继续处理下一条语句。尽管出现架构锁释放错误,插入仍然完成。
当XACT_ABORT
是 时ON
,整个远程批处理被中止,因此插入被回滚。
我能够在本地重现您的问题,但该ORDER BY
条款并不重要。
您可以通过多种方式避免该问题,包括将 包装INSERT
在显式事务中(假设 DTC 可供您使用)。
我建议您避免远程更改的四部分名称语法,因为该实现基于游标模型。通常,使用批量方法或通过在远程服务器上提取数据(而不是从本地服务器推送数据)可以获得更好的性能。
请参阅相关问答哪一种更有效:从链接服务器中选择或插入链接服务器?
归档时间: |
|
查看次数: |
11208 次 |
最近记录: |