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

时间:2015-06-18 09:14:12

标签: mysql sql-server linked-server distributed-transactions

我在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

错误:

  

OLE DB提供程序" MSDASQL"对于链接服务器" MyLinkedServer"返回消息" [MySQL] [ODBC 5.3(a)驱动程序]不支持可选功能"。   Msg 7391,Level 16,State 2,Line 8   无法执行该操作,因为OLE DB提供程序" MSDASQL"对于链接服务器" MyLinkedServer"无法开始分布式交易。

到目前为止我的尝试。

  1. 在MSDTC中启用XA事务

  2. 在链接服务器提供程序

    中启用以下设置
    • 嵌套查询
    • 仅限零级
    • 允许进程
    • 支持'赞'运算符
  3. 我检查了以下链接及其建议,但错误仍然存​​在:

    Distributed transactions between MySQL and MSSQL

    SQL-Server and MySQL interoperability?

    SQL Server and MySQL Syncing

    修改

    其他详情:

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

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

2 个答案:

答案 0 :(得分:3)

理论上这应该有效。

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

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

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

  3. 如果仍然无法正常工作,可能是MSDTC服务本身存在一些问题,看看是否可以隔离就像在MySql服务器上运行一个SQL Server实例一样(如果你使用的是Windows MySql),或者尝试在Sql Server框上安装Windows MySql,以便在两个MySql之间运行分发事务。哪能指出实际问题。

  4. 修改

    不幸的是,看起来你证明这不起作用,我仔细看了一下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

答案 1 :(得分:0)

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