【问题标题】:Query Involving Linked Server Raises Distributed Transaction Error When No Transaction is Used or Needed当不使用或不需要事务时,涉及链接服务器的查询会引发分布式事务错误
【发布时间】: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


【解决方案1】:

我首先发现了导致交易尝试的原因(这是我的目标,因为我不需要交易)。从链接服务器提取数据的过程是使用SELECT ... INTO #temp 模式将该数据插入到#temp 表中。由于它从中选择的表是跨链接服务器的,我相信它也在那里创建了临时表。要么这样,要么它仍在本地创建临时表,但由于所选表跨越链接服务器,它试图扩展事务(隐含于插入语句)以覆盖本地和链接服务器。

无论哪种方式,当我更改为在 INSERT ... SELECT 语句之前的单独语句中创建临时表时,它都可以正常工作!

这并没有向我解释为什么该过程会起作用(每次都通过 SSMS,很少通过 .NET)。我将以某种方式将其归结为不同的执行计划……以及 SQL Server 巫术魔法。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-04-21
    • 1970-01-01
    • 1970-01-01
    • 2015-01-10
    • 2011-03-10
    • 1970-01-01
    • 1970-01-01
    • 2011-10-23
    相关资源
    最近更新 更多