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.
到目前为止我已经尝试了什么。
在 MSDTC 中启用 XA 事务
启用以下链接服务器提供程序中的设置
- 嵌套查询
- 仅零级
- 允许进行中
- 支持“赞”运算符
我检查了以下链接及其建议,但错误仍然存在:
Distributed transactions between MySQL and MSSQL
SQL-Server and MySQL interoperability?
SQL Server and MySQL Syncing
编辑
其他详细信息:
MySQL 正在 Ubuntu 机器上使用 InnoDB 存储引擎。
我已经配置了 ODBC connector 并用它来配置链接服务器中使用的 ODBC 系统数据源
与 SQL 2014 年一样,您可以将链接服务器配置为不加入分布式事务。尽管您可以尝试在 sp_addlinkedserver
的 @provstr 参数中添加 "Enlist=false"
理论上这应该可行。
我建议采取不同的步骤来解决这个问题:
你检查过你的 MySql 存储引擎了吗?看起来只有 InnoDB 存储引擎支持每个 MySql 文档的分布式事务:https://dev.mysql.com/doc/refman/5.7/en/xa.html
看看你是否可以切换到使用 MySQL 连接器设置连接以连接到 SQL 服务器中的 MySql 而不是 OLEDB 提供程序,它由 MySql 上面支持分布式事务的文档。
如果仍然无法正常工作,可能是 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)
我在 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.
到目前为止我已经尝试了什么。
在 MSDTC 中启用 XA 事务
启用以下链接服务器提供程序中的设置
- 嵌套查询
- 仅零级
- 允许进行中
- 支持“赞”运算符
我检查了以下链接及其建议,但错误仍然存在:
Distributed transactions between MySQL and MSSQL
SQL-Server and MySQL interoperability?
SQL Server and MySQL Syncing
编辑
其他详细信息:
MySQL 正在 Ubuntu 机器上使用 InnoDB 存储引擎。
我已经配置了 ODBC connector 并用它来配置链接服务器中使用的 ODBC 系统数据源
与 SQL 2014 年一样,您可以将链接服务器配置为不加入分布式事务。尽管您可以尝试在 sp_addlinkedserver
的 @provstr 参数中添加 "Enlist=false"理论上这应该可行。
我建议采取不同的步骤来解决这个问题:
你检查过你的 MySql 存储引擎了吗?看起来只有 InnoDB 存储引擎支持每个 MySql 文档的分布式事务:https://dev.mysql.com/doc/refman/5.7/en/xa.html
看看你是否可以切换到使用 MySQL 连接器设置连接以连接到 SQL 服务器中的 MySql 而不是 OLEDB 提供程序,它由 MySql 上面支持分布式事务的文档。
如果仍然无法正常工作,可能是 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)