OLE DB provider "SQLNCLI11" for linked server "dbLink01" was unable to begin a distributed transacti

本文针对OLEDBprovider在分布式事务中遇到的问题,提供了详细的解决方案,包括检查MSDTC服务、设置安全选项、开启分布式事务通信、配置hosts文件、开放135端口及调整防火墙设置。

OLE DB provider "SQLNCLI11" for linked server "dbLink01" was unable to begin a distributed transaction

 

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

本文链接:https://blog.youkuaiyun.com/xunzaosiyecao/article/details/21438897

从网上搜集了以下几个解决方案,但对于非同网段的分布式事务,还是解决不了:

我这边报处错误的详细信息是:

异常信息:The operation could not be performed because OLE DB provider "SQLNCLI11" for linked server "dbLink01" was unable to begin a distributed transaction.
OLE DB provider "SQLNCLI11" for linked server "dbLink01" returned message "没有活动事务。".
导致错误的应用程序或对象的名称:.Net SqlClient Data Provider
引发当前异常的方法:
异常相关帮助:
堆栈信息:
   在 System.Data.SqlClient.SqlConnection.OnError(SqlException exception, Boolean breakConnection, Action`1 wrapCloseInAction)
   在 System.Data.SqlClient.SqlInternalConnection.OnError(SqlException exception, Boolean breakConnection, Action`1 wrapCloseInAction)
   在 System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj, Boolean callerHasConnectionLock, Boolean asyncClose)
   在 System.Data.SqlClient.TdsParser.TryRun(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj, Boolean& dataReady)
   在 System.Data.SqlClient.SqlCommand.RunExecuteNonQueryTds(String methodName, Boolean async, Int32 timeout)
   在 System.Data.SqlClient.SqlCommand.InternalExecuteNonQuery(TaskCompletionSource`1 completion, String methodName, Boolean sendToPipe, Int32 timeout, Boolean asyncWrite)
   在 System.Data.SqlClient.SqlCommand.ExecuteNonQuery()

1、 检查本地机器与目标机器的MSDTC(Distributed Transaction Coordinator)服务是否已经启用,具体位置如下图:

2、MSDTC设置

        打开“管理工具――组件服务”,以此打开“组件服务――计算机 – 我的电脑 --- distributed transaction coordinator –本地DTC上右键属性安全选项卡上设置:选中“网络DTC访问”。在客户端管理中选中“允许远程客户端”“允许远程管理”,在事务管理通讯中选“允许入站”“允许出站”“不要求进行验证”,保证DTC登陆账户为:NT   Authority\NetworkService。

3、打开双方服务器,再打开SSMS,右击数据库服务器属性,在连接选项卡勾选"需要将分布式事务用于服务器到服务器的通信." 重启双方数据库服务。

4、检查两台机器能够相互ping通Hostname。注意是机器名,而不是IP。若不可以,进行如下设置:在目录“%windir%\system32\drivers\etc”下的hosts文件,写上IP和HostName的对应信息,如 “10.25.11.185 GSMAJK”。另外,你也可以使用DTCping工具来测试是否可以在两台机器之间使用MSDTC。

 

5、 打开双方135端口

        MSDTC服务依赖于RPC(Remote Procedure Call (RPC))服务,RPC使用135端口,保证RPC服务启动,如果服务器有防火墙,保证135端口不被防火墙挡住。  使用“telnet IP 135 ”命令测试对方端口是否对外开放。也可用端口扫描软件(比如Advanced Port Scanner)扫描端口以判断端口是否开放。

6、允许msdtc服务通过防火墙,没有该选项时,通过点击【允许运行另一程序】按钮添加,位置为C:/windows/system32/msdtc.exe。或者直接关闭防火墙也可以。

 

在使用 OLE DB provider **"MSOLEDBSQL"** 时,若尝试通过链接服务器(例如名为 **ERP_FIN** 的服务器)执行操作,并且数据库会话中设置了 **XACT_ABORT OFF**,可能会遇到如下错误: > Unable to start a nested transaction for OLE DB provider "MSOLEDBSQL" for linked server "ERP_FIN". A nested transaction was required because the XACT_ABORT option was set to OFF. 此错误的根本原因在于 SQL Server 在通过链接服务器执行操作时,对于分布式事务的处理机制存在限制。具体来说,当 **XACT_ABORT** 设置为 **OFF** 时,SQL Server 会尝试启动嵌套事务(nested transaction),但某些 OLE DB 提供者(如 **MSOLEDBSQL**)并不支持在分布式事务中启动嵌套事务,从而导致上述错误[^1]。 ### 解决方案 #### 1. 启用 `XACT_ABORT ON` 建议将当前会话或批处理的 `XACT_ABORT` 设置为 **ON**,以避免触发嵌套事务的启动需求。可以使用如下语句在会话开始前设置: ```sql SET XACT_ABORT ON; ``` 此设置确保在发生运行时错误时事务将被回滚,从而避免尝试启动嵌套事务的需求。 #### 2. 使用 `BEGIN DISTRIBUTED TRANSACTION` 替代本地事务 如果确实需要跨多个服务器执行事务,应显式使用分布式事务控制: ```sql BEGIN DISTRIBUTED TRANSACTION; -- 执行跨服务器操作 COMMIT TRANSACTION; ``` 这种方式可确保事务由分布式事务协调器(MS DTC)管理,避免因嵌套事务导致的兼容性问题。 #### 3. 检查 OLE DB 提供者支持特性 确保使用的 OLE DB 提供者(如 **MSOLEDBSQL**)版本支持分布式事务操作。某些旧版本的提供者可能存在功能限制,建议更新到最新版本以获得更好的兼容性。 #### 4. 避免在触发嵌套事务的上下文中访问链接服务器 若业务逻辑允许,可调整执行顺序或将远程数据操作移出事务上下文,减少对嵌套事务的依赖。 --- ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值