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

Distributed Transaction on Linked Server between sql server and mysql

我在 SQL Server 2014 和 MySQL 上都有一个 table 说 Table1

Table1
ID INT,Code VARCHAR(100)

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

**链接服务器**

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='########'

链接服务器设置

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'

链接服务器创建成功,我可以在SQL服务器中查询MysqlTable。

查询

当我运行

INSERT INTO MyLinkedServer...Table1(ID,Code) SELECT 1,'Code1'

记录已插入。但是,当我开始交易并且 运行 INSERT 时,我得到一个错误:

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

错误:

OLE DB provider "MSDASQL" for linked server "MyLinkedServer" returned message "[MySQL][ODBC 5.3(a) Driver]Optional feature not supported". Msg 7391, Level 16, State 2, Line 8 The operation could not be performed because OLE DB provider "MSDASQL" for linked server "MyLinkedServer" was unable to begin a distributed transaction.

到目前为止我已经尝试了什么。

  1. 在 MSDTC 中启用 XA 事务

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

    • 嵌套查询
    • 仅零级
    • 允许进行中
    • 支持“赞”运算符

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

Distributed transactions between MySQL and MSSQL

SQL-Server and MySQL interoperability?

SQL Server and MySQL Syncing

编辑

其他详细信息:

与 SQL 2014 年一样,您可以将链接服务器配置为不加入分布式事务。尽管您可以尝试在 sp_addlinkedserver

的 @provstr 参数中添加 "Enlist=false"

理论上这应该可行。

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

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

  2. 看看你是否可以切换到使用 MySQL 连接器设置连接以连接到 SQL 服务器中的 MySql 而不是 OLEDB 提供程序,它由 MySql 上面支持分布式事务的文档。

  3. 如果仍然无法正常工作,可能是 MSDTC 服务本身有问题,看看你是否可以隔离它,比如在 SQL 服务器实例 运行 =42=] server box(如果你使用的是 Windows MySql),或者尝试在 Sql Server box 上安装 Windows MySql 以使分布式事务工作在两个 MySql 之间。这将能够指出实际问题。

编辑:

不幸的是,您证明这行不通,我仔细查看了 MySql 文档,很抱歉,我没有仔细阅读它,它说:

Currently, among the MySQL Connectors, MySQL Connector/J 5.0.0 and higher supports XA directly

通过其他一些谷歌搜索,我发现了这个: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, which is to implement your own XA-Compliant Resource Managers to be used by your application (https://msdn.microsoft.com/en-us/library/ms684317.aspx)