分布式事务实战---XA两阶段提交(2PC)方案详解(下)

简介: 分布式事务实战---XA两阶段提交(2PC)方案详解

实践分支事务 id

mysql> xa start 'x01', 'b01';
Query OK, 0 rows affected (0.00 sec)
mysql> select * from t;
+----+------+------+
| id | c    | d    |
+----+------+------+
|  0 |    0 |    0 |
|  1 |    2 |    3 |
|  5 |    5 |    5 |
| 11 |   10 |   10 |
| 15 |   15 |   15 |
| 20 |   20 |   20 |
| 25 |   25 |   25 |
| 30 |   10 |   30 |
+----+------+------+
8 rows in set (0.00 sec)
mysql> insert into t values(2,5,8);
Query OK, 1 row affected (0.00 sec)
mysql> select * from t;
+----+------+------+
| id | c    | d    |
+----+------+------+
|  0 |    0 |    0 |
|  1 |    2 |    3 |
|  2 |    5 |    8 |
|  5 |    5 |    5 |
| 11 |   10 |   10 |
| 15 |   15 |   15 |
| 20 |   20 |   20 |
| 25 |   25 |   25 |
| 30 |   10 |   30 |
+----+------+------+
9 rows in set (0.00 sec)
mysql> xa end 'x01', 'b01';
Query OK, 0 rows affected (0.00 sec)
mysql> xa prepare 'x01', 'b01';
Query OK, 0 rows affected (0.01 sec)
mysql> xa recover;
+----------+--------------+--------------+--------+
| formatID | gtrid_length  | bqual_length | data   |
+----------+--------------+--------------+--------+
|        1 |            3 |            3 | x01b01 |
+----------+--------------+--------------+--------+
1 row in set (0.01 sec)
# gtrid_length 全局事务 id 的长度
# bqual_length 分支事务 id 的长度
mysql> xa commit 'x01', 'b01';
Query OK, 0 rows affected (0.00 sec)
mysql> xa recover;
Empty set (0.00 sec)
mysql> select * from t;
+----+------+------+
| id | c    | d    |
+----+------+------+
|  0 |    0 |    0 |
|  1 |    2 |    3 |
|  2 |    5 |    8 |
|  5 |    5 |    5 |
| 11 |   10 |   10 |
| 15 |   15 |   15 |
| 20 |   20 |   20 |
| 25 |   25 |   25 |
| 30 |   10 |   30 |
+----+------+------+
9 rows in set (0.00 sec)
  • MySQL XA事务状态

ACTIVE状态的XA事务,我们可以执行构成事务的SQL语句,然后发布一个XA END语句。XA END把事务放入IDLE状态。

image.png

XA事务和非XA事务(即本地事务)是互斥的。

例如,已经执行了 XA START 开启一个XA事务,则本地事务不会被启动,直到XA事务已被提交或被回滚为止。相反的,若已使用START TRANSACTION启动一个本地事务,则XA语句不能被使用,直到该事务被提交或被回滚为止。

时序图

完整的 XA 事务处理时序图


image.png

image.png

  • 单个 MySQL 的内部操作

image.png

XA 过程中,事务失败怎么办?

业务 SQL 执行过程,某个 RM 崩溃怎么处理,全部 prepare 后,某个 RM 崩溃怎么处理,commit 时,某个 RM 崩溃怎么办?

MySQL < 5.7的bug
  • 已经prepare的事务, 在客户端退出或者服务宕机的时候,2PC的事务 会被回滚。
  • 在服务器故障重启提交后, 相应的Binlog被丢失

MySQL 5.6版本在客户端退出的时候,自动把已经prepare的事务回滚了 ,那么MySQL为什么要这样做?这主要取决于MySQL的内部实现,MySQL 5.7以前的版本,对于prepare的事务,MySQL 是不会记录binlog的(官方说是减少fsync, 起到了优化的作用)。只有当分布式事务提交的时候才会把前面的操作写入binlog信息,所以对于binlog来说,分布式事务与普通的事务没有区别,而prepare以

前的操作信息都保存在连接的I0 CACHE中,如果这个时候客户端退出了,以前的binlog信息都会被丢失,再次重连后允许提交的话,

会造成Binlog丢失,从而造成主从数据的不一致,所以官方在客户端退出的时候直接把已经prepare的事务都回滚了!

MySQL > 5.7版本的优化

https://dev.mysql.com/worklog/task/?id=6860,MySQL对于分布式事务,在prepare的时候就完成了写Binlog的操作,通过新增一种叫XA _prepare_ log_ event的event类型来实现,这与以前版本的主要区别(以前版本prepare时不写Binlog)。


事务管理器,负责协调多个数据库(资源管理器)的事务。

  1. 事务管理器先问各个DB:预提交 ok 吗?
  2. 如果每个数据库都回复ok,即预提交成功,开始正式提交事务,在各DB开始执行操作,这里失败会有失败异常重试,日志分析,人工重试。

1.png


X/Open,即现在的open group,是一个独立的组织,主要负责制定各种行

业技术标准。X/Open组织主要由各大知名公司或厂商支持,这些组织不光遵循X/Open组织定义的行业技术标准,也参与到标准的制定。

image.png

故障分析

单点故障

协调者出错,事务会失败。

集群部署即可。

阻塞资源

占用数据库连接,性能低。


保持连接是为了第一阶段和第二阶段使用的是同一个事务,确保提交或回滚事务,只需将操作前、后的数据落库记录,就能将当前的连接放弃了。

将连接释放掉,就能保证系统的性能了。


提交阶段什么都不用做,因为数据库已有操作后记录。

回滚也可以,因为已经记录过操作前的记录。

数据不一致

二阶段出错,数据不一致

适用场景

适合单块应用中,跨多库的分布式事务,而且因其严重依赖DB层面解决事务,所以效率很低,不适合高并发场景。


互联网公司基本都不用,因某个系统内部如果出现跨多库的操作,是不合规的。现在的微服务,一个大的系统分成几十甚至上百个服务。一般规约每个服务只能操作自己对应的一个数据库。


如果你要操作别的服务对应的库,不允许直连别的服务的库。要操作别人的服务的库,必须通过调用别的服务的接口。

主流的开源XA分布式事务解决方案

image.png

相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。 &nbsp; 相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情:&nbsp;https://www.aliyun.com/product/rds/mysql&nbsp;
目录
相关文章
|
消息中间件 运维 Kafka
直播预告|Kafka+Flink双引擎实战:手把手带你搭建分布式实时分析平台!
在数字化转型中,企业亟需从海量数据中快速提取价值并转化为业务增长动力。5月15日19:00-21:00,阿里云三位技术专家将讲解Kafka与Flink的强强联合方案,帮助企业零门槛构建分布式实时分析平台。此组合广泛应用于实时风控、用户行为追踪等场景,具备高吞吐、弹性扩缩容及亚秒级响应优势。直播适合初学者、开发者和数据工程师,参与还有机会领取定制好礼!扫描海报二维码或点击链接预约直播:[https://developer.aliyun.com/live/255088](https://developer.aliyun.com/live/255088)
856 35
直播预告|Kafka+Flink双引擎实战:手把手带你搭建分布式实时分析平台!
|
人工智能 Kubernetes 数据可视化
Kubernetes下的分布式采集系统设计与实战:趋势监测失效引发的架构进化
本文回顾了一次关键词监测任务在容器集群中失效的全过程,分析了中转IP复用、调度节奏和异常处理等隐性风险,并提出通过解耦架构、动态IP分发和行为模拟优化采集策略,最终实现稳定高效的数据抓取与分析。
324 2
Kubernetes下的分布式采集系统设计与实战:趋势监测失效引发的架构进化
|
消息中间件 运维 Kafka
直播预告|Kafka+Flink 双引擎实战:手把手带你搭建分布式实时分析平台!
直播预告|Kafka+Flink 双引擎实战:手把手带你搭建分布式实时分析平台!
450 11
|
数据采集 存储 数据可视化
分布式爬虫框架Scrapy-Redis实战指南
本文介绍如何使用Scrapy-Redis构建分布式爬虫系统,采集携程平台上热门城市的酒店价格与评价信息。通过代理IP、Cookie和User-Agent设置规避反爬策略,实现高效数据抓取。结合价格动态趋势分析,助力酒店业优化市场策略、提升服务质量。技术架构涵盖Scrapy-Redis核心调度、代理中间件及数据解析存储,提供完整的技术路线图与代码示例。
2143 0
分布式爬虫框架Scrapy-Redis实战指南
|
数据采集 缓存 NoSQL
分布式新闻数据采集系统的同步效率优化实战
本文介绍了一个针对高频新闻站点的分布式爬虫系统优化方案。通过引入异步任务机制、本地缓存池、Redis pipeline 批量写入及身份池策略,系统采集效率提升近两倍,数据同步延迟显著降低,实现了分钟级热点追踪能力,为实时舆情监控与分析提供了高效、稳定的数据支持。
636 1
分布式新闻数据采集系统的同步效率优化实战
|
缓存 NoSQL 算法
高并发秒杀系统实战(Redis+Lua分布式锁防超卖与库存扣减优化)
秒杀系统面临瞬时高并发、资源竞争和数据一致性挑战。传统方案如数据库锁或应用层锁存在性能瓶颈或分布式问题,而基于Redis的分布式锁与Lua脚本原子操作成为高效解决方案。通过Redis的`SETNX`实现分布式锁,结合Lua脚本完成库存扣减,确保操作原子性并大幅提升性能(QPS从120提升至8,200)。此外,分段库存策略、多级限流及服务降级机制进一步优化系统稳定性。最佳实践包括分层防控、黄金扣减法则与容灾设计,强调根据业务特性灵活组合技术手段以应对高并发场景。
3948 7
|
人工智能 负载均衡 Java
Spring AI Alibaba 发布企业级 MCP 分布式部署方案
本文介绍了Spring AI Alibaba MCP的开发与应用,旨在解决企业级AI Agent在分布式环境下的部署和动态更新问题。通过集成Nacos,Spring AI Alibaba实现了流量负载均衡及节点变更动态感知等功能。开发者可方便地将企业内部业务系统发布为MCP服务或开发自己的AI Agent。文章详细描述了如何通过代理应用接入存量业务系统,以及全新MCP服务的开发流程,并提供了完整的配置示例和源码链接。未来,Spring AI Alibaba计划结合Nacos3的mcp-registry与mcp-router能力,进一步优化Agent开发体验。
4834 14
|
监控 Java 调度
SpringBoot中@Scheduled和Quartz的区别是什么?分布式定时任务框架选型实战
本文对比分析了SpringBoot中的`@Scheduled`与Quartz定时任务框架。`@Scheduled`轻量易用,适合单机简单场景,但存在多实例重复执行、无持久化等缺陷;Quartz功能强大,支持分布式调度、任务持久化、动态调整和失败重试,适用于复杂企业级需求。文章通过特性对比、代码示例及常见问题解答,帮助开发者理解两者差异,合理选择方案。记住口诀:单机简单用注解,多节点上Quartz;若是任务要可靠,持久化配置不能少。
1309 4
|
NoSQL 算法 安全
redis分布式锁在高并发场景下的方案设计与性能提升
本文探讨了Redis分布式锁在主从架构下失效的问题及其解决方案。首先通过CAP理论分析,Redis遵循AP原则,导致锁可能失效。针对此问题,提出两种解决方案:Zookeeper分布式锁(追求CP一致性)和Redlock算法(基于多个Redis实例提升可靠性)。文章还讨论了可能遇到的“坑”,如加从节点引发超卖问题、建议Redis节点数为奇数以及持久化策略对锁的影响。最后,从性能优化角度出发,介绍了减少锁粒度和分段锁的策略,并结合实际场景(如下单重复提交、支付与取消订单冲突)展示了分布式锁的应用方法。
1234 3