分布式协议与算法实战
韩健
腾讯资深工程师
23193 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 31 讲
分布式协议与算法实战
15
15
1.0x
00:00/00:00
登录|注册

加餐 | MySQL XA是如何实现分布式事务的?

二阶段提交协议的局限
存储引擎要求
适用场景
XA ROLLBACK
XA COMMIT
XA PREPARE
XA END
XA START
创建事务ID
ax_unreg()
ax_reg()
xa_rollback()
xa_commit()
xa_prepare()
xa_end()
xa_start()
TM
RM
AP
避免采用分布式事务
性能要求不高的场景
业务系统中的多个数据库更新
性能问题
实现流程
XA接口规范
DTP模型
如何重新设计底层数据系统来避免采用分布式事务?
TCC
重新设计底层数据系统
应用场景
MySQL XA
XA规范
思考题
分布式事务

该思维导图由 AI 生成,仅供参考

你好,我是韩健。
相信很多同学都知道 MySQL 支持单机事务,那么在分布式系统中,涉及多个节点,MySQL 又是怎么实现分布式事务的呢?
这个和我最近遇到的问题很类似,我现在负责的一个业务系统,需要接收来自外部的指令,然后访问多个内部其他系统来执行指令,但执行完指令后,我需要同时更新多个内部 MySQL 数据库中的值(比如 MySQL 数据库 A、B、C)。
但又因为业务敏感,系统必须处于一个一致性状态(也就是说,MySQL 数据库 A、B、C 中的值要么同时更新成功,要么全部不更新)。不然的话,会出现有的系统显示指令执行成功了,有的系统显示指令尚未被执行,导致多部门对指令执行结果理解混乱。
那么我当时是如何实现多个 MySQL 数据库更新的一致性呢?答案就是采用 MySQL XA。
在我看来,MySQL 通过支持 XA 规范的二阶段提交协议,不仅实现了多个 MySQL 数据库操作的事务,还能实现 MySQL、Oracle、SQL Server 等支持 XA 规范的数据库操作的事务。
对你来说,理解 MySQL XA,不仅能理解数据层分布式事务的原理,还能在实际系统中更加深刻的理解二阶段提交协议,这样一来,当你在实际工作中,遇到多个 MySQL 数据库的事务需求时,就知道如何通过 MySQL XA 来处理了。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

MySQL XA是一种用于实现分布式事务的机制,通过支持XA规范的二阶段提交协议,MySQL能够实现多个数据库操作的事务,并且支持与其他数据库如Oracle、SQL Server等的交互。文章介绍了XA规范的基本概念和流程,包括应用程序、资源管理器和事务管理器之间的通讯方式,以及xa_start()、xa_end()、xa_prepare()、xa_commit()等接口的执行顺序和作用。在MySQL中,通过创建唯一的事务ID(xid)来定义事务分支操作,并调用“XA START”、“XA END”、“XA PREPARE”和“XA COMMIT”等命令来实现全局事务的一致性。同时指出了MySQL XA性能不高,适合在并发性能要求不高的场景中使用,且只有InnoDB引擎支持XA规范。文章通过实际问题的解决案例,深入浅出地介绍了MySQL XA的原理和应用,对于需要处理多个MySQL数据库事务需求的读者具有实际指导意义。 总结:本文深入介绍了MySQL XA实现分布式事务的机制和应用。XA规范通过二阶段提交协议实现多数据库操作的事务,并支持与其他数据库的交互,但MySQL XA性能不高,适用于并发性能要求不高的场景。文章通过实际案例深入浅出地介绍了MySQL XA的原理和应用,对读者具有实际指导意义。文章还提到了在MySQL XA不能满足并发需求时,重新设计底层数据系统来避免采用分布式事务的思考。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《分布式协议与算法实战》
新⼈⾸单¥59
立即购买
登录 后留言

全部留言(15)

  • 最新
  • 精选
  • 侧耳倾听
    既然是多数据库场景,首先,需要搞清楚的是为什么引入多数据库?如果是基于性能的考虑,并发量大,需要考虑的是读多写少,还是写多读少?如果是读多写少,那么可以采用一主多从,主库负责写,以及引入缓存机制来提高数据的实时性。如果是写多读少,问题有些复杂,如果读的实时要求不高,可以考虑采用队列的形式,后台线程负责写入数据库。如果是基于业务的拆分,要搞明白是不是需要拆分?是在现有硬件基础上解决不了并发的写入,还是仅仅是因为模仿。如果是后者,不妨先考虑将业务表的表空间分不到不同的磁盘,避免单磁盘的写入,可以提高一定的数据写入效率。在这个过程中还需要考虑数据库各种缓存的大小设定,比如chang buffer,redolog文件。争取做到单点优化做到无突破,再考虑横向或者纵向的扩展。一旦牵扯进分布式架构,就不再是一个数量级的问题展现。

    作者回复: 加一颗星:)

    2020-06-23
    34
  • ppyh
    这个和我最近遇到的问题很类似,我现在负责的一个业务系统,需要接收来自外部的指令,然后访问多个内部其他系统来执行指令,但执行完指令后,我需要同时更新多个内部 MySQL 数据库中的值(比如 MySQL 数据库 A、B、C)。 不过,虽然 MySQL XA 能实现数据层的分布式事务,但在我现在负责的这套业务系统中,还面临这样的问题:那就是在接收到外部的指令后,我需要访问多个内部系统,执行指令约定的操作,而且,我必须保证指令执行的原子性,也就是说,要么全部成功,要么全部失败,那么我应该怎么做呢?答案是 TCC,这也是我在下一讲想和你聊一聊的。 这两句话有区别吗,怎么第一句话就可以用mysql xa,第二句话就得用tcc啊

    作者回复: 加一颗星:),第一个问题是如何实现多个MySQL间的操作事务,第二问题,是实现多个业务系统(包括非数据库系统)的操作事务,这时要考虑TCC了。

    2020-06-26
    3
    21
  • hello
    课程都完结好长一段时间了,老师还在时不时加餐,给老师点赞。

    作者回复: 感谢一路相伴,多交流:)

    2020-06-23
    9
  • 槑·先生
    老师,有个问题不太理解。事务不就包含原子性吗?分布式事务不是也应该包含指令的原子性吗,为什么会存在最后那个指令原子性的问题。

    作者回复: 加一颗星:),MySQL XA实现的是数据库层面的分布式事务,那么,当不仅涉及到数据库,还涉及到其他业务系统时,这时就需要TCC了。

    2020-06-22
    2
    4
  • ξ!
    老师,raft是不是在保证有状态节点间的内存中数据一致性,而XA在保证数据持久化后的一致性

    作者回复: 加一颗星:),XA实现的是分布式事务,系统状态的一致性,操作要么全部执行成功,要么全部不执行。Raft能保证的是,写操作完成后,后续所有的读操作都能读取到更新后的值。

    2020-06-23
    4
    2
  • Geek_9d0e04
    请假老师,操作两个数据库,我自己在代码中也能实现两阶段提交呀,两个数据库连接先各自执行自己的SQL,作为第一阶段;都没问题再提交事务,否则回滚,作为第二阶段。我觉得事务管理器的作用,也就是上面内容吧,那为何有需要独立一个事务管理器,增加单点呢?

    作者回复: 加一颗星:),事务管理器是逻辑的,一般不需要独立的事务管理器。

    2020-07-19
    1
  • Heaven
    我的思路是,首先只在主节点上执行事务,然后降低和跟随者的延迟,来保证,在主节点上执行成功了,必然会可以在从节点上执行成功,这是否是一种解决方案呢? 可以利用GTID来辅助查询工作

    作者回复: 加一颗星:),这里的场景是执行多条SQL语句,在不同节点上执行不同的语句,需要实现各节点状态的一致,要么全部成功,要么全部失败。

    2020-08-20
  • 扩散性百万咸面包
    按照文章中的表述,如果要实现分布式事务的话,需要对应的数据库实现XA规范接口。而且客户端会聚集一定的复杂性:因为我看图中客户端需要把一个事务里的不同语句发给不同的MySQL,那要怎么样才能知道自己的语句应该放在哪个SQL上执行呢?

    作者回复: 加一颗星:),不同的连接。

    2020-08-19
  • janey
    请问老师,mysql xa在xa prepare后资源锁定,锁定的主要是什么资源呢?这个资源锁定的影响面主要是哪些?
    2022-03-11
    3
  • 天天有吃的
    xa的实现就是2pc、3pc吧
    2023-08-21归属地:广东
收起评论
显示
设置
留言
15
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部