连接服务器的OLE DB提供程序"SQLNCLI"无法开始分布式事务

7
我正在尝试调用SQL Server 2008中的存储过程,并将检索到的数据存储到本地临时表中。运行代码时,我收到以下错误提示: “由于连接服务器的OLE DB提供程序”SQLNCLI“无法开始分布式事务,因此无法完成操作。”
我的代码如下:
create table #temp(
    col1 as int,
    col2 as varchar(50)
)

insert into #temp
exec [192.168.0.9].[db1].[dbo].[tablename] @usr_id=3
2个回答

8

您可以通过将服务器选项'remote proc transaction promotion'设置为'false'来防止使用分布式事务进行链接服务器:

EXEC sp_serveroption 'servername', 'remote proc transaction promotion', 'false'

Here's the same issue


这对我很有效!谢谢您链接到另一个答案。我想知道设置属性的缺点是什么。我认为只要我不在本地和链接的服务器上更改数据,然后稍后需要回滚所有那些事务,那么我就应该没问题。 - MikeTeeVee

3

联接服务器无法开始分布式事务错误是由于MSDTC(MS分布式事务协调器)出现问题。这些问题可能来自多种原因,包括MSDTC未运行、被防火墙阻止等。

如果需要使用事务,您必须自己进行环境调试,因为问题通常是由环境引起的。如果可以重写以避免需要事务,则生活将更加简单。只需编写一个不依赖于MSDTC的简单查询即可确保它是MSDTC问题。例如:

create table #temp( col1 as int, col2 as varchar(50) )

insert into #temp 
select col1, col2 from [192.168.0.9].[db1].[dbo].[tablename] where usr_id=3

如果这个方法可行,那肯定是MSDTC(也许可以避免这个问题)。
-- 添加了此内容。花了一点时间寻找MSDTC调试。http://www.sqlwebpedia.com/content/msdtc-troubleshooting非常好,http://www.mssqltips.com/sqlservertip/2083/troubleshooting-sql-server-distributed-transactions-part-1-of-2/两者共同涵盖了我所能回想起来的所有必须为MSDTC问题进行调试的内容(还有其他一些)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接