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

Posted

技术标签:

【中文标题】sql server 和 mysql 之间的链接服务器上的分布式事务【英文标题】:Distributed Transaction on Linked Server between sql server and mysql 【发布时间】:2015-09-03 20:19:18 【问题描述】:

我在 SQL Server 2014 和 mysql 上都有一个表说 Table1

Table1
ID INT,Code VARCHAR(100)

我使用“Microsoft OLEDB Provider for ODBC”在 SQL Server 中创建了一个链接服务器 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 Server 中查询 Mysql 表了。

查询

当我跑步时

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

记录被插入。然而,当我开始一个事务并运行INSERT 时,我得到一个错误:

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

错误:

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

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

    在 MSDTC 中启用 XA 事务

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

    嵌套查询 仅零级 允许进程内 支持“点赞”运算符

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

Distributed transactions between MySQL and MSSQL

SQL-Server and MySQL interoperability?

SQL Server and MySQL Syncing

编辑

其他细节:

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

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

【问题讨论】:

您能否发布您的 ddl 以创建链接服务器? @PhilipDevine - 使用链接服务器详细信息更新问题 在这里你可以找到一些在另一种情况下对我有帮助的检查:***.com/questions/7473508/…HTH 【参考方案1】:

理论上这应该可行。

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

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

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

    如果还是不行,可能是MSDTC服务本身有问题,看看能不能隔离,比如在MySql服务器上运行SQL Server实例(如果你使用的是Windows MySql),或者尝试在 Sql Server 框上安装 Windows MySql 以在两个 MySql 之间分配事务。这将能够指出您的实际问题。

编辑:

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

目前,在 MySQL 连接器中,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)

【讨论】:

谢谢,Mysql 存储引擎是 InnoDB,它在 Ubuntu 机器上。让我在同一台 Windows 机器上试用我的两个,我会更新你 先在 Sql Server windows box 上安装 MySQL 连接器怎么样? 我已经配置了ODBC connector,并用它来配置链接服务器中使用的ODBC系统数据源 在 Windows 机器上使用 mysql 和 sql server 以及启用所有设置的 MSDTC 进行了尝试。运气不好 :( "[MySQL][ODBC 5.3(w) Driver]Optional feature not supported" 表明 odbc 连接器或 mysql 本身不支持此功能。 我已经更新了我的答案,看起来如果你真的想让它工作,你必须做一些编码。【参考方案2】:

与 SQL 2014 一样,您可以将链接服务器配置为不参与分布式事务。虽然您可以尝试在 sp_addlinkedserver 的 @provstr 参数中添加“Enlist=false”

【讨论】:

“您可以将链接服务器配置为不参与分布式事务”。我想要一个分布式事务。这是我的要求。无需交易即可正常工作。 使用此链接希望对您有所帮助***.com/questions/7204452/…

以上是关于sql server 和 mysql 之间的链接服务器上的分布式事务的主要内容,如果未能解决你的问题,请参考以下文章

Linux 运行升讯威在线客服系统:同时支持 SQL Server 和 MySQL 的实现方法

Linux 运行升讯威在线客服系统:同时支持 SQL Server 和 MySQL 的实现方法

Linux + .net core 开发升讯威在线客服系统:同时支持 SQL Server 和 MySQL 的实现方法

Linux + .net core 开发升讯威在线客服系统:同时支持 SQL Server 和 MySQL 的实现方法

SQL Server 2008 R2:查找两列之间的链接和链接

mysql/sql server和java之间的数据类型对应关系