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

     2023-02-24     168

关键词:

【中文标题】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 2008 R2:查找两列之间的链接和链

】SQLServer2008R2:查找两列之间的链接和链【英文标题】:SQLServer2008R2:Findlinkandchainbetweentwocolumns【发布时间】:2018-07-0803:06:32【问题描述】:表:createtabletbl_test(col1int,col2int);记录:INSERTINTOtbl_testVALUES(111,112),(112,113),(113,114),(114,111 查看详情

mysql和sql server的区别?性能,功能,...? [关闭]

】mysql和sqlserver的区别?性能,功能,...?[关闭]【英文标题】:Differencebetweenmysqlandsqlserver?Performance,features,...?[closed]【发布时间】:2009-03-2016:50:31【问题描述】:MySQL和Sqlserver有什么区别?两者之间选择的参数是什么?【问题讨... 查看详情

SQL Server 中数字、浮点数和小数之间的区别

】SQLServer中数字、浮点数和小数之间的区别【英文标题】:Differencebetweennumeric,floatanddecimalinSQLServer【发布时间】:2010-11-0613:54:15【问题描述】:numeric、float和decimal数据类型之间有什么区别,应该在哪些情况下使用?对于任何一... 查看详情

在 Sql Server 2008 上链接 MySQL 服务器

】在SqlServer2008上链接MySQL服务器【英文标题】:LinkingMySQLserveronSqlServer2008【发布时间】:2015-02-0819:49:51【问题描述】:在我们的应用程序中,我必须在部署在Linux机器上的MySqlServer和部署在Windows机器上的SQLServer之间传输数据,这... 查看详情

SQL Server 2012 链接服务器到 MySQL 慢速选择查询

】SQLServer2012链接服务器到MySQL慢速选择查询【英文标题】:SQLServer2012LinkedServertoMySQLSlowSelectQuery【发布时间】:2014-04-1616:58:28【问题描述】:我正在运行SQLServer2012,并通过最新的MySQLODBC驱动程序设置了与LinuxMySQL实例的链接服务... 查看详情

将sybase存储过程作为链接服务器过程sql server 2008执行

】将sybase存储过程作为链接服务器过程sqlserver2008执行【英文标题】:Executesybasestoredprocedureaslinkedserverproceduresqlserver2008【发布时间】:2011-02-2216:22:45【问题描述】:编辑最终目标是使用来自SQLServer2008的输入和输出参数通过链接服... 查看详情

SQL Server Compact Edition 和真正的 SQL Server 之间的 T-SQL 区别?

】SQLServerCompactEdition和真正的SQLServer之间的T-SQL区别?【英文标题】:T-SQLdifferencesbetweenSQLServerCompactEditionandrealSQLServer?【发布时间】:2010-08-3020:12:22【问题描述】:来自广泛的SQLServerT-SQL背景,我很难找到任何描述SQLCE和成熟SQLServ... 查看详情

SQL Server 2008 和 SQL Server CE 之间的同步框架

】SQLServer2008和SQLServerCE之间的同步框架【英文标题】:SyncFrameworkbetweenSQLServer2008andSQLServerCE【发布时间】:2012-06-1321:39:30【问题描述】:我正在使用一个包含大约60,000条记录的中等大小的数据库。我正在构建一个移动应用程序,... 查看详情

如何将两个不同数据库(MySQL、SQL SERVER)之间的 TEXT 字段与哈希值进行比较?

】如何将两个不同数据库(MySQL、SQLSERVER)之间的TEXT字段与哈希值进行比较?【英文标题】:HowdoIcompareaTEXTfieldbetweentwodifferentdatabases(MySQL,SQLSERVER)withahash?【发布时间】:2021-10-1523:36:19【问题描述】:我正在尝试快速比较两个独立... 查看详情

SQL Server 2005 和 SQL Server 2012 之间的全文搜索中的行为不匹配

】SQLServer2005和SQLServer2012之间的全文搜索中的行为不匹配【英文标题】:BehaviormismatchinFulltextsearchbetweenSQLServer2005andSQLServer2012【发布时间】:2016-07-2510:49:49【问题描述】:最初我们有SQLServer2005,然后迁移到SQLServer2012。然后SQLServer... 查看详情

使用 OPENQUERY 语法通过链接服务器 (SQL Server 2005) 调用 MySQL 存储过程(带参数)的问题

】使用OPENQUERY语法通过链接服务器(SQLServer2005)调用MySQL存储过程(带参数)的问题【英文标题】:IssuecallingaMySQLstoredprocedure(withparams)viaalinkedserver(SQLServer2005)usingOPENQUERYsyntax【发布时间】:2010-12-0422:22:39【问题描述】:我在尝试使... 查看详情

sql server 中两个日期之间的年份以及每个日期在 sql server 中的开始和结束日期

】sqlserver中两个日期之间的年份以及每个日期在sqlserver中的开始和结束日期【英文标题】:yearsbetweentwodatesinsqlserverwithstartingandenddateofeachoftheminsqlserver【发布时间】:2019-09-1812:22:30【问题描述】:我想获取两个日期之间的年份及... 查看详情

从开发人员的 POV 看 SQL Server 2008 和 SQL Server 2008 R2 之间的差异

】从开发人员的POV看SQLServer2008和SQLServer2008R2之间的差异【英文标题】:DifferencesBetweenSQLServer2008andSQLServer2008R2fromadeveloper\'sPOV【发布时间】:2010-08-0521:25:38【问题描述】:我正在设置我的开发机器,我想知道是否应该在我的机器... 查看详情

SQL Server:计算上一个日期和当前日期之间的天数差异

】SQLServer:计算上一个日期和当前日期之间的天数差异【英文标题】:SQLServer:Countdaysdifferencebetweenpreviousdateandcurrentdate【发布时间】:2018-03-2614:36:51【问题描述】:我一直在尝试找到一种方法来计算两个日期与前一行和当前行之... 查看详情

为啥 SQL Server GEOGRAPHY 允许 -15069° 和 +15069° 之间的经度?为啥是±15069°?

】为啥SQLServerGEOGRAPHY允许-15069°和+15069°之间的经度?为啥是±15069°?【英文标题】:WhydoesSQLServerGEOGRAPHYallowlongitudesbetween-15069°and+15069°?Why±15069°?为什么SQLServerGEOGRAPHY允许-15069°和+15069°之间的经度?为什么是±15069°?【发布时... 查看详情

SQL Server中左连接和右连接之间的区别[重复]

】SQLServer中左连接和右连接之间的区别[重复]【英文标题】:DifferencebetweenleftjoinandrightjoininSQLServer[duplicate]【发布时间】:2011-06-1013:59:21【问题描述】:我知道SQLServer中的联接。例如。有两个表Table1,Table2。它们的表结构如下。cr... 查看详情

Oracle 和 SQL Server 中的 NVARCHAR 之间的区别?

】Oracle和SQLServer中的NVARCHAR之间的区别?【英文标题】:DifferencebetweenNVARCHARinOracleandSQLServer?【发布时间】:2013-08-2121:53:04【问题描述】:我们正在将一些数据从sqlserver迁移到oracle。对于在SQLServer中定义为NVARCHAR的列,我们开始在O... 查看详情

在 SQL Server 中使用纬度和经度查找两点之间的距离

】在SQLServer中使用纬度和经度查找两点之间的距离【英文标题】:FinddistancebetweentwopointsusinglatitudeandlongitudeinSQLServer【发布时间】:2021-09-1611:55:50【问题描述】:我一直在看这个问题,只是想知道这是否可以在SQLServer中完成。Findd... 查看详情