查询位于TransactionScope内时,链接服务器无法启动分布式事务

时间:2013-04-26 19:01:46

标签: sql-server linked-server

我有一个涉及链接服务器的查询。查询在SSMS中运行正常,并在使用Dapper

在C#中进行包装时运行
 var conn = GetOpenConnection(connInitializer);
 return query(conn);

产生预期结果。但是,当我将代码放在TransactionScope

中时
using (var trans = new TransactionScope())
{
     var conn = GetOpenConnection(connInitializer);
     var returnValue = query(conn);
     trans.Complete();
     return returnValue;
}

我收到了错误:

“无法执行操作,因为链接服务器xxx的OLE DB提供程序”SQLNCLI11“无法启动分布式事务。”

我应该修改一些SQL Sever配置才能使其正常工作吗?

1 个答案:

答案 0 :(得分:3)

由于您在显式事务中执行查询,因此要求查询遵循these ACID properties。您需要configure Microsoft Distributed Transaction Coordinator (MSDTC)来管理跨数据源的交易。

由于查询最初在交易范围之外工作,我猜它是一个简单的选择。如果是这种情况,您可能需要考虑为每个数据源打开单独的连接,在应用程序对象中加载必需的数据,然后从那里合并以生成结果。

否则,请准备好解决MSDTC连接问题并监视孤立事务的事务队列。