快速,持续,稳定,傻瓜式
支持Mysql,Sqlserver数据同步

Microsoft SQL Server与MariaDB之间的分布式事务-神话

在线QQ客服:1922638

专业的SQL Server、MySQL数据库同步软件

介绍

MariaDB是MySQL的直接替代品。它是由Monty Widenius和他的团队(创建MySQL的人)创建的。许多软件巨头,例如Google,RedHat,Wikimedia等,都因其技术优势而从MySQL迁移到了MariaDB(ref:link)。

因此,MariaDB现在是一个热门话题,MariaDB与著名的Microsoft SQL Server之间的分布式事务是非常需要的。并且本文提供了完成的试验/实验以及链接,证明了MariaDB和Microsoft SQL Server之间的分布式事务是一个神话。

注意:由于MySQL和MariaDB的开发人员相同,因此它们的内部体系结构相似,并且迁移并非难事。

背景

从Google从MySQL迁移到MariaDB并将其一名工程师投入MariaDB开发的那一刻起,MariaDB就已经非常有名了。我发布这篇文章的主要原因是Internet上有很多帮助,但很少能说出涉及MariaDB和MS SQL Server的分布式事务的真相。

实验进行

进行此实验之前安装的软件列表(先决条件): 

  1. Microsoft SQL Server 2008 R2
  2. MariaDB 5.5.33a – x86
  3. MySQL的ADO.NET驱动程序(mysql-connector-net-6.7.4.msi)[目的稍后在本文档中介绍] – x86
  4. Windows的ODBC驱动程序– x64(mysql-connector-odbc-5.2.5-winx64.msi)[本文档后面介绍的目的]

进行的实验:

  • 尝试1 –从MSSQL Server
  • 尝试2 –从.NET(代码)–事务范围
  • 尝试3 –从.NET(代码)–具有两阶段提交的事务范围
  • 使用AutoEnlist关键字

尝试1 –从MS SQL Server:

使用具有流行概念的“链接服务器”的MS SQL Server 2008 R2进行了此分布式事务的首次尝试。为了链接MariaDB服务器,我们需要一个驱动程序:“ Windows的ODBC驱动程序– x86(mysql-connector-odbc-5.2.5-winx64.msi)”。

您需要安装此驱动程序并配置数据源。可以通过开始->控制面板->所有控制面板项目->管理工具->数据源(ODBC)来完成。在其中添加已安装驱动程序的“ System DSN”(Unicode或ANSI驱动程序)。

添加数据源后,我们必须创建一个链接服务器,创建过程在单独的附件中。或者,您可以使用“ MS SQL SERVER 2008 R2->对象资源管理器->服务器对象->链接服务器”来创建一个。

现在,我尝试使用MSSQL和MariaDB的分布式事务创建存储过程,只是发现MSSQL抛出错误–

OLE DB provider "MSDASQL" for linked server "MARIADB" returned message 
  "[Microsoft][ODBC Driver Manager] Data source name not found and no default driver specified".
Msg 7303, Level 16, State 1, Procedure Proc_test_distributedtrans_sql_mariadb_ins, Line 21
Cannot initialize the data source object of OLE DB provider "MSDASQL" for linked server "MARIADB".

尝试2 –从.NET(代码)–事务范围: 

现在,.NET平台已投入使用。

(为此需要MySQL的ADO.NET驱动程序(mysql-connector-net-6.7.4.msi。在安装它之后,将名为’ MySql.Data.dll的dll添加到项目的引用中并导入。)

TransactionScope建立了 A ,并购买了两个连接字符串,一个是MSSQL,另一个是MariaDB。同样在这里,在代码执行过程中,当打开MSSQL或MySQL(MariaDB)连接时不会有任何问题,但是在单个事务中打开第二个连接的瞬间(即使在关闭第一个连接之后),也会引发以下所示的错误

“System.NotSupportedException was caught
  Message=Specified method is not supported.”
(Or)
“MySQL Connector/Net does not currently support distributed transactions.”

尝试3 –从.NET(代码)–具有两个阶段提交的事务范围:

为此还需要MySQL的ADO.NET驱动程序(mysql-connector-net-6.7.4.msi)。此方法与上述方法类似,因为该方法也在a下运行,TransactionScope但执行“两阶段提交”。一个称为Prepare阶段,下一个称为Commit阶段。其来源在附件中提供。

甚至结果也很相似,相同的错误和相同的错误。

“System.NotSupportedException was caught
  Message=Specified method is not supported.”
(Or)
“MySQL Connector/Net does not currently support distributed transactions.”

使用AutoEnlist关键字:

可以在扩展搜索中找到此关键字,但有时会被误解。

有关此信息,请参阅MySQL文档。如果您仅执行MySQL(MariaDB)事务,并且发生相同错误

“MySQL Connector/Net does not currently support distributed transactions”

抛出该异常,那么您可以使用它AutoEnlist 并将其设置为false,以使编译器理解您所执行的不是不同数据库之间的分布式事务。

现在,如果在我们的情况下使用此关键字(涉及不同数据库的分布式事务),则您将成功执行程序而不会出错,但是事务的目的将失败。从AutoEnlist <code>= false编译的那一刻起,该批处理将从当前事务中TransactionScope排除,MariaDB并且其结果将在有ExecuteNonQuery()语句的任何地方提交。它不会等待Scope对象引发该Complete()方法。

推断的资料:

从上述尝试/实验中可以明显看出,MariaDB(MySQL)数据库中不允许使用分布式事务。(即使Microsoft分布式事务处理协调器正在运行)。

而这里是它会在MySQL网站本身的MySQL(MariaDB的)不允许“分布式事务”来指定。而且它在MySQL 6.1 alpha中也不是固定的。 

(请参阅之后发表的名为“ [[2008年6月11日12:01] Cyrille Giquello]的评论”以及其他评论。)

兴趣点

我学到了一件重要的事情,不仅在MariaDB(MySQL)和MS SQL之间不支持分布式事务,而且通常也不会 使用分布式事务。 以下是一些建议不要一般使用“分布式交易”的链接。他们强调的主要原因是网络问题,它可能导致非原子交易,而这根本不是交易。

  • http://stackoverflow.com/questions/128377/what-is-the-best-way-to-do-distributed-transactions-across-multiple-databases
  • http://c2.com/cgi/wiki?DistributedTransactionsAreEvil

历史

我将在下一篇文章中将MySQL上传到MariaDB迁移过程。我本来应该先做的,但是由于这引起了我的极大兴趣,所以我要先发布此内容。

相关推荐

咨询软件
 
QQ在线咨询
售前咨询热线
QQ1922638