【发布时间】:2018-01-03 06:34:25
【问题描述】:
我有一个多线程调度程序进程 (.NET),它调用需要从链接服务器提取数据并最终将数据插入本地表的存储过程。我没有明确使用任何事务——我不关心进程失败,因为我可以重新运行。此外,我想避免分布式事务(MSDTC)的复杂性。
我遇到的是大部分时间通过 .NET 进程,我收到以下错误:
The operation could not be performed because OLE DB provider "SQLNCLI11" for linked server "XXXX" was unable to begin a distributed transaction.
OLE DB provider "SQLNCLI11" for linked server "XXXX" returned message "No transaction is active.
当我从 SQL Server Management Studio 执行存储过程时,它没有收到错误消息。我一直在尝试追踪 SSMS 执行与 .NET 的不同之处,并且我发现一些实例是 .NET 进程没有收到错误。但即便如此,我也无法区分何时失败与何时失败。
为了它的价值,我在程序中添加了一些记录以记录@@trancount,它始终注册为2。我可以理解一个隐式事务来覆盖INSERT语句以保存日志,但我无法记帐第二个。对于它的价值,我的存储过程实际上调用了第二个访问链接服务器的过程——不确定这是否相关。综上所述,@@trancount 即使在成功时也会返回 2(无论是从 SSMS 还是 .NET 调用)。
DBA 已更改链接服务器属性以确保“启用分布式事务的提升”为假。我还应该尝试什么?谢谢!
【问题讨论】:
-
IIRC,这要么是 LinkedServer 定义的问题,要么是本地或远程 SQL Server 上的 MSDTC 设置问题。我建议将其带到 hhtp://dba.stackexchange.com,那里有更多可能知道详细信息的 DBA。
-
另外,这个问题有很多有用的信息:stackoverflow.com/questions/7473508/…
-
@RBarryYoung:感谢您的回复。我已经找到了这两个问题——大多数事情似乎都适用于如何纠正 MSDTC。我们的 DBA 已禁用此功能,并希望保持这种状态。另外,在这种情况下我什至不想要交易,所以我一直很难弄清楚我在做什么来导致交易。我刚刚找到了导致它的原因,并将其作为答案发布。
标签: .net sql-server transactions linked-server msdtc