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 的实现方法