sql server和mysql之间链接服务器上的分布式事务

ugh*_*hai 7 mysql sql-server linked-server distributed-transactions

我有一张Table1关于SQL Server 2014和MySQL 的表.

Table1
ID INT,Code VARCHAR(100)
Run Code Online (Sandbox Code Playgroud)

MyLinkedServer使用"Microsoft OLEDB Provider for ODBC"在SQL Server中创建了一个链接服务器.

**链接服务器**

EXEC master.dbo.sp_addlinkedserver @server = N'MyLinkedServer', @srvproduct=N'MyLinkedServer', @provider=N'MSDASQL', @datasrc=N'MyLinkedServer'
EXEC master.dbo.sp_addlinkedsrvlogin @rmtsrvname=N'MyLinkedServer',@useself=N'False',@locallogin=NULL,@rmtuser=N'username',@rmtpassword='########'
Run Code Online (Sandbox Code Playgroud)

链接服务器设置

EXEC master.dbo.sp_serveroption @server=N'MyLinkedServer', @optname=N'data access', @optvalue=N'true'
EXEC master.dbo.sp_serveroption @server=N'MyLinkedServer', @optname=N'use remote collation', @optvalue=N'true'
EXEC master.dbo.sp_serveroption @server=N'MyLinkedServer', @optname=N'remote proc transaction promotion', @optvalue=N'true'
Run Code Online (Sandbox Code Playgroud)

链接服务器已成功创建,我可以在SQL Server中查询Mysql表.

询问

我跑的时候

INSERT INTO MyLinkedServer...Table1(ID,Code) SELECT 1,'Code1'
Run Code Online (Sandbox Code Playgroud)

记录已插入.但是,当我启动一个事务并运行时INSERT,我收到一个错误:

BEGIN TRAN
INSERT INTO MyLinkedServer...Table1(ID,Code) SELECT 1,'Code1'
COMMIT
Run Code Online (Sandbox Code Playgroud)

错误:

链接服务器"MyLinkedServer"的OLE DB提供程序"MSDASQL"返回消息"[MySQL] [ODBC 5.3(a)驱动程序]不支持可选功能".消息7391,级别16,状态2,行8无法执行操作,因为链接服务器"MyLinkedServer"的OLE DB提供程序"MSDASQL"无法启动分布式事务.

到目前为止我尝试过的.

  1. 在MSDTC中启用XA事务

  2. 在链接服务器提供程序中启用以下设置

    • 嵌套查询
    • 仅限零级
    • 允许进程
    • 支持'喜欢'运营商

我检查了以下链接及其建议,但错误仍然存​​在:

MySQL和MSSQL之间的分布式事务

SQL-Server和MySQL的互操作性?

SQL Server和MySQL同步

编辑

额外细节:

  • MySQL在Ubuntu机器上使用InnoDB存储引擎.

  • 我已经配置了ODBC连接器并使用它来配置链接服务器中使用的ODBC系统数据源

Sim*_*ang 3

理论上这应该可行。

我建议采取不同的步骤来解决这个问题:

  1. 你检查过你的MySql存储引擎了吗?看起来只有 InnoDB 存储引擎支持按 MySql 文档分发事务: https: //dev.mysql.com/doc/refman/5.7/en/xa.html

  2. 看看是否可以切换到使用 MySQL Connectors 设置连接来连接 SQL Server 中的 MySql,而不是 OLEDB 提供程序,上面的 MySql 文档指出支持分发事务。

  3. 如果仍然无法正常工作,则可能是 MSDTC 服务本身存在问题,请查看是否可以隔离该问题,例如在 MySql 服务器上运行 SQL Server 实例(如果您使用的是 Windows MySql),或者尝试在 MySql 服务器上安装 Windows MySql Sql Server 框用于在两个 MySql 之间分配事务。这将能够向您指出实际问题。

编辑:

不幸的是,看来你证明这不起作用,我仔细查看了 MySql 文档,很遗憾,我没有彻底阅读它,它说:

目前MySQL Connector中,MySQL Connector/J 5.0.0及更高版本直接支持XA

通过其他一些谷歌搜索,我发现了这个:https://bugs.mysql.com/bug.php? id=37283,人们多年前就报告了这个错误,他们将其标记为无法修复。

有人在这里提出了一些建议: https: //social.msdn.microsoft.com/Forums/en-US/fc07937d-8b42-43da-8c75-3a4966ab95f9/xa-msdtc ?forum=windowstransactionsprogramming,这是实现你自己的XA-您的应用程序要使用的合规资源管理器 ( https://msdn.microsoft.com/en-us/library/ms684317.aspx )