如何为链接服务器启用分布式事务?

Man*_*eld 7 sql-server linked-server sql-server-2012 iseries distributed-transactions

我有一个 SQL Server 2012 实例,其中一个链接服务器使用 System i Access ODBC 驱动程序指向 IBM Iseries 系统上的 db2 数据库。

我正在尝试启用分布式事务。我相信该提供商确实根据IBM 文档支持它们(除非我误解了该链接)。

我正在运行以下查询:

BEGIN TRANSACTION
    UPDATE LINKEDSERVER.LINKEDDATABASE.SCHEMANAME.TABLENAME SET COLUMN = VALUE

    SELECT CAST('qwerty' as integer) -- we want an error here so the transaction fails
COMMIT TRANSACTION
Run Code Online (Sandbox Code Playgroud)

我收到以下错误:

链接服务器“LINKEDSERVER”的 OLE DB 提供程序“MSDASQL”返回消息“[IBM][System i Access ODBC 驱动程序]登记 DTC 阶段失败。2”。消息 7391,级别 16,状态 2,第 2 行 由于链接服务器“LINKEDSERVER”的 OLE DB 提供程序“MSDASQL”无法开始分布式事务,因此无法执行该操作。

我对这个错误所做的所有研究都遇到过想要禁用分布式事务而不是让它们工作的人。我已经在链接服务器属性上将“启用分布式事务的提升”设置为 true。

任何想法如何让这个工作?

编辑:更多信息/更新。当我在 Windows 日志中注意到这一点时,我正准备暂时放弃这个并等待帮助:

当 XA 事务被禁用时,调用者试图注册一个 XA 资源。

我找到了这个链接,它告诉我如何修改 MSDTC 的设置。在使用设置并重新启动我的服务器之后,事情开始工作(有点):(具体来说,我启用了网络 DTC 访问,允许入站/出站/启用 XA 事务)。

在此处输入图片说明

目前,查询按预期运行并提交/回滚,但似乎有时可以工作,但有时会出错。错误是:

链接服务器“LINKEDSERVER”的 OLE DB 提供程序“MSDASQL”返回消息“[IBM][System i Access ODBC 驱动程序]内部驱动程序错误。”

EDIT2:现在它不再工作了。错误信息:

链接服务器“LINKEDSERVER”的 OLE DB 提供程序“MSDASQL”返回消息“ODBC 驱动程序无法启动新事务。”。链接服务器“LINKEDSERVER”的 OLE DB 提供程序“MSDASQL”返回消息“[Microsoft][ODBC 驱动程序管理器] 在事务服务器组件事务中进行非法操作”。

小智 7

除了设置本地 DTC 属性外,您还需要打开两台机器上的防火墙,以允许程序分布式事务协调器通过。

允许分布式事务协调器通过 Windows 防火墙进行通信

在查询编辑器窗口中测试 T-SQL 时,请确保按照 Microsoft 的建议打开 XACT_ABORT。

对于大多数 OLE DB 提供程序(包括 SQL Server)的隐式或显式事务中的数据修改语句,必须将 XACT_ABORT 设置为 ON。唯一不需要此选项的情况是提供程序支持嵌套事务。

就我而言,对于本地 DTC 属性,我只需要这些: 故障诊断代码设置


Anu*_*hah 2

检查 DTC 和 SQL Browser 服务是否在正确的服务帐户下运行。

另请检查以下 MS-BOL 链接以获取更多配置帮助。

在 SQL Server 中使用分布式事务的推荐 MSDTC 设置

您可以使用此工具来确定您的系统是否具有正确的 MSDTC 配置。

2012 年最佳实践分析器

最后但并非最不重要的

了解 XA 事务

让我们知道您正在尝试的一些示例查询。