一文搞懂mysqlxa如何实现分布式事务(代码片段)

神技圈子 神技圈子     2022-12-11     630

关键词:

一文搞懂MySQL XA如何实现分布式事务

前言

MySQL支持单机事务的良好表现毋庸置疑,那么在分布式系统中,涉及多个节点,MySQL又是如何实现分布式事务的呢?比如开发一个业务系统,它接受外部的请求,然后访问多个内部其它系统才能执行该请求。执行时我们需要同时更新多个数据库的值(D1,D2,D3)。由于系统必须处于一个一致性,也就是这三个数据库的值要么同时更新成功,要么全部不更新。不然会造成子系统有些指令成功了,有些指令尚未执行。导致对结果理解混乱。
那么,MySQL如何实现多个MySQL数据库更新的一致性呢?那就是MySQL XA。MySQL正是靠支持XA规范的二阶段提交协议,才实现了多个数据库的操作。

XA 协议

提到XA规范就得来聊一下DTP模型(Distributed Transaction Processing)。XA规范就是约定DTP模型中的两个模块事务管理器和资源管理器的通讯方式。DTP其实就是分布式事务处理

各个模块的作用如下:

  • AP(Application Program):应用程序,定义事务边界(定义事务开始和结束)并访问事务边界内的资源。
  • RM(Resource Manger)资源管理器: 管理共享资源并提供外部访问接口。供外部程序来访问数据库等共享资源。此外,RM还具有事务的回滚能力。
  • TM(Transaction Manager)事务管理器:TM是分布式事务的协调者,TM与每个RM进行通信,负责管理全局事务,分配事务唯一标识,监控事务的执行进度,并负责事务的提交、回滚、失败恢复等。

刚开始看可能觉得不好理解,总结起来该架构就是应用程序访问及使用资环管理器提供的共享资源,通过事务管理器提供的事务接口(TX interface)定义事务操作。事务管理器和资源管理会基于XA规范执行二阶段提交协议。
XA规范流程如下图所示

  • 应用程序AP向事务管理器TM发起事务请求
  • TM调用xa_open()建立同资源管理器的会话
  • TM调用xa_start()标记一个事务分支的开头
  • AP访问资源管理器RM并定义操作,比如插入记录操作
  • TM调用xa_end()标记事务分支的结束
  • TM调用xa_prepare()通知RM做好事务分支的提交准备工作。其实就是二阶段提交的提交请求阶段。
  • TM调用xa_commit()通知RM提交事务分支,也就是二阶段提交的提交执行阶段。
  • TM调用xa_close管理与RM的会话。
    这些接口一定要按顺序执行,比如xa_start接口一定要在xa_end之前。此外,这里千万要注意的是事务管理器只是标记事务分支并不执行事务,事务操作最终是由应用程序通知资源管理器完成的。
    另外,我们来总结下XA的接口
  • xa_start:负责开启或者恢复一个事务分支,并且管理XID到调用线程
  • xa_end:负责取消当前线程与事务分支的关系
  • xa_prepare:负责询问RM 是否准备好了提交事务分支 xa_commit:通知RM提交事务分支
  • xa_rollback:通知RM回滚事务分支

如何通过MySQL XA实现分布式事务

Mysql中存在两种XA事务,一种是内部XA事务主要用来协调存储引擎和二进制日志,一种是外部事务可以参与到外部分布式事务中(比如多个数据库实现的分布式事务),这里我们主要讨论外部事务。

注:MySQL中只有当隔离级别设置为Serializable的时候才能使用分布式事务。
MySQL的XA语法如下

XA START|BEGIN xid [JOIN|RESUME]
XA PREPARE xid
XA END xid
XA COMMIT xid[ONE PHASE]
XA ROLLBACK xid
XA RECOVER[CONVERT XID ]

其中xid作为事务ID,唯一表示一个事务分支,每个事务分支都有一个id。
首先要确认是否开启了XA 功能

设置隔离级别为serializable

执行结果

  • 首先调用“XA START ‘xid’ ”命令把XA事务置于ACTIVATE状态,接着执行构成事务的多条SQL语句(比如 update
    t1 set c1 = ‘a’ where id=1),也就是指定事务的边界。然后调用“XA END ‘xid’ ”把事务放入IDLE状态,也就是结束事务边界。

  • 接着,对于一个处于IDLE状态的XA事务,可以执行“XA PREPARE”命令或一个“XA COMMIT…ONE PHASE”命令,XA
    PREPARE来执行二阶段提交协议的提交请求阶段。执行“XA RECOVER”命令会列出处于PREPARED状态的所有XA事务。XA
    COMMIT…ONE PHASE用于预备和提交事务,也就是转换为一阶段协议,直接提交事务。

  • 最后,调用“XA COMMIT”来提交事务(或者“XA ROLLBACK”回滚事务)。这样就实现了全局事务的一致性了。

    通过上面的流程可以看到,在MySQL数据库分布式事务中,MySQL的角色其实是XA事务过程中的RM,TM是连接MySQL服务器的客户端。在分布式事务中一般会涉及到至少两个RM,所以我们说的MySQL支持XA协议是说mysql作为RM来说的,也就是说MySQL实现了XA协议中RM应该具有的功能。

一文搞懂mysqlxa如何实现分布式事务(代码片段)

一文搞懂MySQLXA如何实现分布式事务前言XA协议如何通过MySQLXA实现分布式事务前言MySQL支持单机事务的良好表现毋庸置疑,那么在分布式系统中,涉及多个节点,MySQL又是如何实现分布式事务的呢?比如开发一个业... 查看详情

一文快速搞懂mysqlinnodb事务acid实现原理(代码片段)

【51CTO.com原创稿件】说到数据库事务,想到的就是要么都做修改,要么都不做,或者是ACID的概念。其实事务的本质就是锁、并发和重做日志的结合体。这一篇主要讲一下InnoDB中的事务到底是如何实现ACID的:原子性(atomicity)一致... 查看详情

一文让你搞懂spring的统一事务模型

...先来了解一下Spring事务,都有哪些内容:Spring事务包含对分布式事务和单机事务的支持,我们用的比较多的是单机事务,也就是只操作一个数据库的事务。单机事务,按照用法分,又可以分为编程式事务模型(TransactionTemplate)... 查看详情

内含面试|一文搞懂hbase的基本原理(代码片段)

...开源实现的,是一个高可靠、高性能、面向列、可伸缩的分布式 查看详情

一文彻底搞懂zookeeper(代码片段)

...和使用1.Zookeeper简介1.1什么是ZookeeperZookeeper是一个开源的分布式的,为分布式应用提供协调服务的Apache项目。本质上,就是文件系统+通知机制1.2Zookeeper工作机制Zookeeper从设计模式角度来理解:是一个基于观察者模... 查看详情

一文彻底搞懂zookeeper(代码片段)

...和使用1.Zookeeper简介1.1什么是ZookeeperZookeeper是一个开源的分布式的,为分布式应用提供协调服务的Apache项目。本质上,就是文件系统+通知机制1.2Zookeeper工作机制Zookeeper从设计模式角度来理解:是一个基于观察者模... 查看详情

java中的线程池如何实现,一文彻底搞懂(代码片段)

前言为什么要用线程池一键获取线程相关资料,还可获取最新java面试真题库在HotSpotVM的线程模型中,Java线程被一对一映射为内核线程。Java在使用线程执行程序时,需要调用操作系统内核的API,创建一个内核线程&... 查看详情

一文彻底搞懂kafka(代码片段)

...用一、Kafka的简介1.1Kafka基本概念(1)什么是KafkaKafka是一个分布式的基于发布/订阅模式的消息队列,主要应用于大数据实时处理领域(2)消息队列点对点模式的消息队列对一个消息而言,只会有一个消费者可以消费,消费... 查看详情

一文彻底搞懂hbase(代码片段)

...ase的学习和使用一、HBase的简介1.1HBase基本概念HBase是一种分布式、可扩展、支持海量数据存储的NoSQL数据库,可以解决HDFS随机写的问题1.2HBase数据模型逻辑上,HBase的数据模型同关系型数据库很类似,数据存储在一张... 查看详情

一文彻底搞懂hbase(代码片段)

...ase的学习和使用一、HBase的简介1.1HBase基本概念HBase是一种分布式、可扩展、支持海量数据存储的NoSQL数据库,可以解决HDFS随机写的问题1.2HBase数据模型逻辑上,HBase的数据模型同关系型数据库很类似,数据存储在一张... 查看详情

一文搞懂仿射变换(代码片段)

导读在图像处理中,我们经常需要对图像进行各种操作如平移、缩放、旋转、翻转等,这些其实都是图像的仿射变换。通过本篇文章,你能够知道它们的实现原理以及如何应用它们。仿射变换仿射变换也称仿射投影&#x... 查看详情

一文搞懂memcache的使用(代码片段)

...始成〞Memcached是国外社区网站LiveJournal的开发的高性能的分布式内存缓存服务器,为了减少数据库的连接数,减轻数据库的压力,NoSql优点在于速度快,简单易学,缺点在没有官方支持,安全性较差。如果... 查看详情

一文搞懂如何使用node.js进行tcp网络通信(代码片段)

....js的TCP通信部份进行实践记录。本文分享自华为云社区《一文搞懂如何使用Node.js进行TCP网络通信》,作者:lwq1228。1、构建TCP服务器1.1、使用 查看详情

一文让你搞懂javascript如何实现继承(代码片段)

一、本文想给你聊的东西包含一下几个方面:(仅限于es6之前的语法哈,因为es6里面class这关键字用上了。。)1.原型是啥?原型链是啥?2.继承的通用概念。3.Javascript实现继承的方式有哪些? 二、原型是啥?原型链是啥?1.... 查看详情

分布式事务,原理简单,写起来全是坑(代码片段)

分布式事务,我们已经给小伙伴介绍了整体内容:一文搞明白分布式事务解决方案!真的soeasy!AT模式的实现:手把手带领小伙伴们写一个分布式事务案例!AT模式在多数据源中的应用:SpringBoot多数据... 查看详情

分布式事务,原理简单,写起来全是坑(代码片段)

分布式事务,我们已经给小伙伴介绍了整体内容:一文搞明白分布式事务解决方案!真的soeasy!AT模式的实现:手把手带领小伙伴们写一个分布式事务案例!AT模式在多数据源中的应用:SpringBoot多数据... 查看详情

图文并茂!!!一文搞懂springaop(面向切面编程)(代码片段)

文章目录SpringAOPAOP概述核心原理及使用案例AOP的基本概念(Spring的专业术语)SpringAOP实现SpringAOP的使用导入实现AOP的AspectJ的jar基于AspectJ的xml配置实现五种通知类型配置注解实现SpringAOP我们为什么要使用AOP(面向切面... 查看详情

一文搞懂对称加密:加密算法工作模式填充方式代码实现(代码片段)

微信搜索:码农StayUp主页地址:https://gozhuyinglong.github.io源码分享:https://github.com/gozhuyinglong/blog-demos上篇介绍了《单向散列加密》,它是一种消息摘要算法。该算法在信息安全领域,有很多重要的应用场景࿰... 查看详情