当涉及链接服务器的查询引发分布式事务错误当没有使用事务或需要时
我有一个多线程调度程序进程(.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已更改链接的服务器属性以确保“启用分布式事务的提升”为false。我还应该尝试什么?谢谢!
我首先发现了导致事务尝试的原因(这是我的目标,因为我不需要事务)。从链接服务器提取数据的过程是使用SELECT ... INTO #temp
模式将该数据插入到#temp表中。由于它选择的表是跨链接服务器,我相信它也在那里创建临时表。要么,要么它仍然在本地创建临时表,但由于所选表是跨越链接服务器的,它试图扩展事务(隐式到插入语句)以涵盖本地服务器和链接服务器。
无论哪种方式,当我更改为在INSERT ... SELECT
语句之前的单独语句中创建临时表时,它的运行没有错误!
这并不能解释给我的是为什么程序会工作(每次通过SSMS,很少通过.NET)。我会根据不同的执行计划以及SQL Server巫术魔法来粉饰它。
IIRC,这可能是LinkedServer定义的问题,或者与本地或远程SQL Server上的MSDTC设置有关。我建议把它带到hhtp://dba.stackexchange.com,那里有更多的DBA可能知道详细信息。 – RBarryYoung
此外,这个问题有很多有用的信息:https://stackoverflow.com/questions/7473508/unable-to-begin-a-distributed-transaction – RBarryYoung
而这里:https://stackoverflow.com/questions/18657768/ole-db-provider-sqlncli-for-linked-server-was-unable-to-begin-a-distributed-tr – RBarryYoung