返回顶部
首页 > 资讯 > 数据库 >MySQL 5.7的分布式事务支持举例分析
  • 670
分享到

MySQL 5.7的分布式事务支持举例分析

2024-04-02 19:04:59 670人浏览 独家记忆
摘要

本篇内容主要讲解“Mysql 5.7的分布式事务支持举例分析”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“mysql 5.7的分布式事务支持举例分析”吧! 分

本篇内容主要讲解“Mysql 5.7的分布式事务支持举例分析”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习mysql 5.7的分布式事务支持举例分析”吧!

分布式事务通常采用2PC协议,全称Two Phase Commitment Protocol。该协议主要为了解决在分布式数据库场景下,所有节点间数据一致性的问题。在分布式事务环境下,事务的提交会变得相对比较复杂,因为多个节点的存在,可能存在部分节点提交失败的情况,即事务的ACID特性需要在各个数据库实例中保证。总而言之,在分布式提交时,只要发生一个节点提交失败,则所有的节点都不能提交,只有当所有节点都能提交时,整个分布式事务才允许被提交。

分布式事务通过2PC协议将提交分成两个阶段

  1. prepare;

  2. commit/rollback

第一阶段的prepare只是用来询问每个节点事务是否能提交,只有当得到所有节点的“许可”的情况下,第二阶段的commit才能进行,否则就rollback。需要注意的是:prepare成功的事务,则必须全部提交。

Mysql分布式事务

一直以来,MySQL数据库是支持分布式事务的,但是只能说是有限的支持,具体表现在:

  • 已经prepare的事务,在客户端退出或者服务宕机的时候,2PC的事务会被回滚

  • 服务器故障重启提交后,相应的Binlog被丢失

上述问题存在于MySQL数据库长达数十年的时间,直到MySQL-5.7.7版本,官方才修复了该问题。虽然InNoSQL早已在5.5版本修复,但是对比官方的修复方案,我们真的做的没有那么的优雅。下面将会详细介绍下该问题的具体表现和官方修复方法,这里分别采用官方MySQL-5.6.27版本(未修复)和MySQL-5.7.9版本(已修复)进行验证。

先来看下存在的问题,我们先创建一个表如下:

create table t(
    id int auto_increment primary key, 
    a int
)engine=innodb;

对于上述表,通过如下操作进行数据插入:

mysql> XA START 'mysql56';
mysql> INSERT INTO t VALUES(1,1);
mysql> XA END 'mysql56';
mysql> XA PREPARE 'mysql56'

通过上面的操作,用户创建了一个分布式事务,并且prepare没有返回错误,说明该分布式事务可以被提交。通过命令XA RECOVER查看显示如下结果:

mysql> XA RECOVER;
+----------+--------------+--------------+---------+
| fORMatID | gtrid_length | bqual_length | data    |
+----------+--------------+--------------+---------+
| 1        | 7            | 0            | mysql56 |
+----------+--------------+--------------+---------+

若这时候用户退出客户端后重连,通过命令xa recover会发现刚才创建的2PC事务不见了。即prepare成功的事务丢失了,不符合2PC协议规范!!!

产生上述问题的主要原因在于:MySQL-5.6版本在客户端退出的时候,自动把已经prepare的事务回滚了,那么MySQL为什么要这样做?这主要取决于MySQL的内部实现,MySQL-5.7以前的版本,对于prepare的事务,MySQL是不会记录binlog的(官方说是减少fsync,起到了优化的作用)。只有当分布式事务提交的时候才会把前面的操作写入binlog信息,所以对于binlog来说,分布式事务与普通的事务没有区别,而prepare以前的操作信息都保存在连接的io_CACHE中,如果这个时候客户端退出了,以前的binlog信息都会被丢失,再次重连后允许提交的话,会造成Binlog丢失,从而造成主从数据的不一致,所以官方在客户端退出的时候直接把已经prepare的事务都回滚了!

官方的做法,貌似干得很漂亮,牺牲了一点标准化的东西,至少保证了主从数据的一致性。但其实不然,若用户已经prepare后在客户端退出之前,MySQL发生了宕机,这个时候又会怎样?

MySQL在某个分布式事务prepare成功后宕机,宕机前操作该事务的连接并没有断开,这个时候已经prepare的事务并不会被回滚,所以在MySQL重新启动后,引擎层通过recover机制能恢复该事务。当然该事务的Binlog已经在宕机过程中被丢失,这个时候,如果去提交,则会造成主从数据的不一致,即提交没有记录Binlog,从上丢失该条数据。所以对于这种情况,官方一般建议直接回滚已经prepare的事务。

以上是MySQL-5.7以前版本MySQL在分布式事务上的各种问题,那么MySQL-5.7版本官方做了哪些改进?这个可以从官方的WL#6860描述上得到一些信息,我们还是本着没有实践就没有发言权的态度,从具体的操作上来分析下MySQL-5.7的改进方法:

还是以上面同样的表结构进行同样的操作如下:

mysql> XA START 'mysql57';
mysql> INSERT INTO t VALUES(1,1);
mysql> XA END 'mysql57';
mysql> XA PREPARE 'mysql57'通过上面的操作,明显发现在prepare以后,从XA START到XA PREPARE之间的操作都被记录到了Master的Binlog中,然后通过复制关系传到了Slave上。也就是说MySQL-5.7开始,MySQL对于分布式事务,在prepare的时候就完成了写Binlog的操作,通过新增一种叫

当然仅靠这一点是不够的,因为我们知道Slave通过SQL thread来回放Relay log信息,由于prepare的事务能阻塞整个session,而回放的SQL thread只有一个(不考虑并行回放),那么SQL thread会不会因为被分布式事务的prepare阶段所阻塞,从而造成整个SQL thread回放出现问题?这也正是官方要解决的第二个问题:怎么样能使SQL thread在回放到分布式事务的prepare阶段时,不阻塞后面event的回放?其实这个实现也很简单(在xa.cc::applier_reset_xa_trans),只要在SQL thread回放到prepare的时候,进行类似于客户端断开连接的处理即可(把相关cache与SQL thread的连接句柄脱离)。最后在Slave服务器上,用户通过命令XA RECOVER可以查到如下信息:

mysql> XA RECOVER;
+----------+--------------+--------------+---------+
| formatID | gtrid_length | bqual_length | data    |
+----------+--------------+--------------+---------+
| 1        | 7            | 0            | mysql57 |
+----------+--------------+--------------+---------+

至于上面的事务什么时候提交,一般等到Master上进行XA COMMIT  ‘mysql57’后,slave上也同时会被提交。

到此,相信大家对“MySQL 5.7的分布式事务支持举例分析”有了更深的了解,不妨来实际操作一番吧!这里是编程网网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

您可能感兴趣的文档:

--结束END--

本文标题: MySQL 5.7的分布式事务支持举例分析

本文链接: https://lsjlt.com/news/66924.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • MySQL 5.7的分布式事务支持举例分析
    本篇内容主要讲解“MySQL 5.7的分布式事务支持举例分析”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“MySQL 5.7的分布式事务支持举例分析”吧! 分...
    99+
    2024-04-02
  • C#支持事件举例分析
    本篇内容介绍了“C#支持事件举例分析”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!这里介绍C#支持事件(这个特点也是MSVJ所具有的),当前...
    99+
    2023-06-17
  • LINQ TO SQL分布式事务举例分析
    本篇内容介绍了“LINQ TO SQL分布式事务举例分析”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!LINQ TO SQL,顾名思义,涉及...
    99+
    2023-06-17
  • MySQL支不支持事务嵌套的案例分析
    MySQL支不支持事务嵌套的案例分析?这个问题可能是我们日常学习或工作经常见到的。希望通过这个问题能让你收获颇深。下面是小编给大家带来的参考内容,让我们一起来看看吧!最近开发中遇到了使用MySQL,多次开启...
    99+
    2024-04-02
  • Samza是否支持分布式事务
    是的,Samza支持分布式事务。它提供了由Kafka事务管理器管理的端到端事务保证,可以确保消息的精确一次性传递,并实现了精确一次性...
    99+
    2024-04-02
  • Docker的安全性支持举例分析
    这篇文章主要讲解了“Docker的安全性支持举例分析”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Docker的安全性支持举例分析”吧!Docker作为最重视安全的容器技术之一,在很多方面都...
    99+
    2023-06-04
  • mysql是否支持分布式
    下文主要给大家带来mysql是否支持分布式,希望这些内容能够带给大家实际用处,这也是我编辑mysql是否支持分布式这篇文章的主要目的。好了,废话不多说,大家直接看下文吧。    &nbs...
    99+
    2024-04-02
  • 支持python分布式计算框架Ray的示例分析
    这篇文章将为大家详细讲解有关支持python分布式计算框架Ray的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。1、简介Ray为构建分布式应用程序提供了一个简单、通用的API。Ray是一种分布式执...
    99+
    2023-06-20
  • NoSQL数据库怎么支持分布式事务
    NoSQL数据库通常不直接支持分布式事务,因为它们更专注于分布式存储和高可用性。然而,有一些方法可以在使用NoSQL数据库时实现类似...
    99+
    2024-05-07
    NoSQL
  • Seata分布式事务XA与AT的示例分析
    本篇文章为大家展示了Seata分布式事务XA与AT的示例分析,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。Seata 是一款开源的分布式事务解决方案,star 高达...
    99+
    2024-04-02
  • JPA多数据源分布式事务的示例分析
    这篇文章主要介绍了JPA多数据源分布式事务的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。问题背景在解决mysql字段脱敏处理时,结合sharding-jdbc的脱敏...
    99+
    2023-06-29
  • fescar分布式事务实现原理实例分析
    这篇文章主要介绍了fescar分布式事务实现原理实例分析的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇fescar分布式事务实现原理实例分析文章都会有所收获,下面我们一起来看看吧。项目说明本博文所述代码为fes...
    99+
    2023-06-29
  • ThinkJS2.1支持TypeScript的示例分析
    这篇文章主要为大家展示了“ThinkJS2.1支持TypeScript的示例分析”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“ThinkJS2.1支持TypeS...
    99+
    2024-04-02
  • Netty分布式监听读事件的示例分析
    小编给大家分享一下Netty分布式监听读事件的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!我们回到AbstractUnsafe的register0()方...
    99+
    2023-06-29
  • mysql闪回flashback-5.7的示例分析
    今天就跟大家聊聊有关mysql闪回flashback-5.7的示例分析,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。1.首先确认误操作的位置2.使用...
    99+
    2024-04-02
  • MySQL事务的示例分析
    这篇文章将为大家详细讲解有关MySQL事务的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。ACID 特性事务处理是一种对必须整批执行的 MySQL 操作的管理机制...
    99+
    2024-04-02
  • Mysql tools中的orzdba举例分析
    本篇内容主要讲解“Mysql tools中的orzdba举例分析”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Mysql tools中的orzdba举例分析”吧...
    99+
    2024-04-02
  • mysql innodb的行锁举例分析
    这篇文章主要讲解了“mysql innodb的行锁举例分析”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“mysql innodb的行锁举例分析”吧! ...
    99+
    2024-04-02
  • Golang技术如何支持分布式系统中的分布式跟踪?
    go语言中的分布式跟踪至关重要,它允许开发人员跟踪请求在分布式系统中的流动,以便进行故障排除和性能优化。go语言提供了opentracing库,它是一个平台无关的api,允许应用程序与跟...
    99+
    2024-05-07
    分布式系统 分布式跟踪 git golang go语言
  • MySQL 5.7并发复制隐式bug实例分析
    前言 我们MySQL线上环境大部分使用的是5.7.18的版本,这个版本已修复了很多bug,但针对主从复制的bug还是有很多的,尤其是一些组复制、并行复制的bug尤为突出,在5.7.19版本有做相应改善和修复...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作