实现分布式事务管理,应用XA事务与TCC模式
ccwgpt 2025-01-03 14:36 52 浏览 0 评论
一、引言
在当今复杂的分布式系统中,数据的一致性和事务的可靠性至关重要。分布式事务管理成为了确保分布式系统中数据完整性和业务逻辑正确性的关键手段。其中,XA 事务与 TCC 模式是两种重要的分布式事务管理方式。
XA 事务是一种由 X/Open 组织提出的分布式交易处理规范,它定义了事务管理器(TM)和资源管理器(RM)之间的接口,通过两阶段提交协议来保证数据的强一致性。许多分布式关系型数据管理系统都采用此协议来完成分布式事务。然而,XA 事务也存在一些缺点,如性能不好,无法满足高并发场景等。
TCC 模式则是一种业务层的两阶段提交方案,事务分为 Try(尝试执行)、Confirm(确认提交)和 Cancel(取消回滚)三个阶段。每个阶段都有相应的业务接口,由业务系统自行实现。TCC 模式具有较高的性能,减少了锁竞争,灵活性高,能够明确控制每个事务阶段,但开发复杂,需要定义和实现 Try、Confirm 和 Cancel 接口,且需要业务系统对事务一致性负责。
二、XA 事务
1. XA 事务介绍
XA 是由 Tuxedo 提出,由 X/Open 组织定义的分布式事务协议。目前主流数据库如 Oracle、MySQL 等支持该协议。XA 协议主要定义了事务管理器(TM)和局部资源管理器(RM)之间的接口,通过两阶段提交协议来保证数据的强一致性。
2. XA 事务原理
- 两阶段提交:
- 将事务分为 prepare 和 commit 两个阶段。以电商系统为例,分布式系统中有订单、账户和库存三个服务。第一阶段,事务协调者向事务参与者发送 prepare 请求,事务参与者收到请求后,如果可以提交事务,回复 yes,否则回复 no。第二阶段,如果所有事务参与者都回复了 yes,事务协调者向所有事务参与者发送 commit 请求,否则发送 rollback 请求。
- 优点是保证数据强一致性,但也存在一些问题,比如同步阻塞,本地事务在 prepare 阶段锁定资源,如果有其他事务也要修改数据,就必须等待前面的事务完成,这样就造成了系统性能下降;协调节点单点故障,如果第一个阶段 prepare 成功了,但是第二个阶段协调节点发出 commit 指令之前宕机了,所有服务的数据资源处于锁定状态,事务将无限期地等待;数据不一致,如果第一阶段 prepare 成功了,但是第二阶段协调节点向某个节点发送 commit 命令时失败,就会导致数据不一致。
- 三阶段提交:
- 在两阶段提交基础上引入超时机制和 preCommit 阶段。第一阶段的 prepare 阶段分成了两步,canCommit 和 preCommit。引入 preCommit 阶段后,协调节点会在 commit 之前再次检查各个事务参与者的状态,保证它们的状态是一致的。
- 但仍存在问题,那就是如果第三阶段发出 rollback 请求,有的节点没有收到,那没有收到的节点会在超时之后进行提交,造成数据不一致。
- XA 事务语法介绍:
- 三阶段的第一阶段:开启 xa 事务,这里 xid 为全局事务 id:XA {START|BEGIN} xid [JOIN|RESUME];结束 xa 事务:XA END xid [SUSPEND [FOR MIGRATE]]。
- 三阶段的第二阶段,即 prepare:XA PREPARE xid。
- 三阶段的第三阶段,即 commit/rollback:XA COMMIT xid [ONE PHASE];XA ROLLBACK xid。
- 查看处于 PREPARE 阶段的所有事务:XA RECOVER;XA RECOVER [CONVERT XID]。
3. seata XA 简介
seata 的 XA 模式利用分支事务中数据库对 XA 协议的支持实现,对传统三阶段提交做了优化,改为两阶段提交。具体流程如下:第一阶段首执行 XA 开启、执行 sql、XA 结束三个步骤,之后直接执行 XA prepare;第二阶段执行 XA commit/rollback。但对 oracle 支持不太好,因为 oracle 实现的是标准的 xa 协议,即 xa end 后,协调节点向事务参与者统一发送 prepare,最后再发送 commit/rollback。
三、TCC 模式
1. TCC 模式定义
TCC 是 Try-Confirm-Cancel 的缩写,是一种用于分布式事务处理的解决方案。它需要实现的方法包括 Try(资源的检测和预留)、Confirm(完成资源操作业务,要求 Try 成功 Confirm 一定要能成功)、Cancel(预留资源释放,可以理解为 try 的反向操作)。
2. TCC 模式原理
TCC 模式将事务拆分为三个阶段:Try 阶段进行资源预留,Confirm 阶段确认提交,Cancel 阶段取消操作并回滚预留资源。
例如在一个分布式事务中,涉及到订单服务和库存服务。在 Try 阶段,订单服务可能会检查订单信息是否完整,并预留订单编号等资源;库存服务则会检查库存是否充足,并预留相应的库存数量。如果 Try 阶段所有服务都成功预留了资源,那么进入 Confirm 阶段。在 Confirm 阶段,订单服务会正式生成订单,库存服务会确认扣除预留的库存数量。如果在 Try 阶段有任何一个服务出现问题,或者在 Confirm 阶段出现异常,就会进入 Cancel 阶段。在 Cancel 阶段,订单服务会取消预留的订单编号等资源,库存服务会释放预留的库存数量。
3. TCC 模式的优缺点
- 优点:
- 高性能,将事务分为多个小事务减少锁持有时间。在 TCC 模式中,由于事务被拆分为多个小的阶段,每个阶段只对部分资源进行操作,因此减少了锁的持有时间,提高了系统的并发性能。
- 灵活性强,可根据需要灵活实现三个阶段逻辑。TCC 模式不依赖于特定的数据库事务机制,开发人员可以根据业务需求灵活地实现 Try、Confirm 和 Cancel 三个阶段的逻辑,更好地满足复杂业务场景的需求。
- 不依赖数据库事务,适用于非事务型数据库。TCC 模式完全不依赖数据库的事务支持,而是通过业务逻辑的控制来实现事务的一致性,因此适用于非事务型数据库或者在分布式环境下跨数据库的事务处理。
- 缺点:
- 代码入侵,需要人为编写 try、Confirm 和 Cancel 接口。TCC 模式要求开发人员在业务代码中显式地编写 Try、Confirm 和 Cancel 三个接口,这增加了开发的难度和工作量,同时也对业务代码造成了一定的侵入性。
- 软状态,事务最终一致,需考虑 Confirm 和 Cancel 的失败情况及幂等处理。在 TCC 模式中,事务并不是在一个时刻完全一致的,而是通过一系列的操作逐步达到最终一致的状态。因此,开发人员需要考虑 Confirm 和 Cancel 阶段可能出现的失败情况,并进行相应的重试和幂等处理,以保证事务的最终一致性。
- 可能出现事务悬挂和空回滚问题。事务悬挂指的是当一个分布式事务在执行过程中,一个或多个资源长时间被锁定,导致其他分布式事务无法访问该资源,进而产生阻塞和死锁的问题。空回滚指的是分布式事务中已经提交了修改,但是由于某些原因无法回滚的情况,导致整个事务无法提交,只能回滚,造成了资源的浪费和性能的降低。
4. TCC 模式的实现
通过一个订单服务和库存服务的示例展示 TCC 模式在 Java 中的实现。假设在一个电商系统中,有订单服务和库存服务两个微服务。当用户下单时,订单服务需要创建订单并扣除库存。在 TCC 模式下,订单服务和库存服务需要分别实现 Try、Confirm 和 Cancel 三个接口。
在 Try 阶段,订单服务会检查订单信息是否完整,并预留订单编号等资源。库存服务会检查库存是否充足,并预留相应的库存数量。如果 Try 阶段所有服务都成功预留了资源,那么进入 Confirm 阶段。在 Confirm 阶段,订单服务会正式生成订单,库存服务会确认扣除预留的库存数量。如果在 Try 阶段有任何一个服务出现问题,或者在 Confirm 阶段出现异常,就会进入 Cancel 阶段。在 Cancel 阶段,订单服务会取消预留的订单编号等资源,库存服务会释放预留的库存数量。
四、XA 事务与 TCC 模式对比
1. 设计模式区别
- XA 有预提交过程,两阶段提交在第二阶段才执行 commit;TCC 在第一阶段就 commit 了,没有预提交过程。
- XA 事务在两阶段提交过程中,有一个协调者在中间起到重要作用。当所有的事务都执行成功,会把执行成功的状态通知协调者,这个阶段是第一阶段。协调者监听到所有的事务执行成功后,执行第二阶段的 commit。
- 而 TCC 模式不同,其在第一阶段就 commit 了。TCC 的第二阶段是一个确认(Confirm)的阶段,只需要调用各个子系统里的 confirm 逻辑,把原来没有更新到数据库的那些 “缓存” 数据更新到数据库。因为这个时候已经把更改的数据缓存起来了,只是还没更新到数据库,所以在执行 confirm 逻辑的时候,并不会持有数据库的锁。
2. 应用场景区别
- XA 更多应用在单体架构,TCC 更多应用在分布式架构。
- XA 事务更多应用在单体架构上,因为其在并发量不大的时候性能更高,不需要远程的 api 调用。
- TCC 模式更多应用在分布式架构上,因为其将事务拆分为三个阶段,每个阶段只对部分资源进行操作,减少了锁的持有时间,提高了系统的并发性能。
3. 性能区别
- 并发量不大时,XA 性能更高,因无需远程 api 调用;高并发场景下,TCC 优势大,因其第一阶段就提交事务,不继续持有数据库锁。
- 当并发量不大的时候,XA 的性能更高。因为 XA 事务不需要远程的 api 调用,所以在低并发场景下,XA 事务的性能优势明显。
- 但是在高并发场景下,TCC 优势很大。因为 TCC 模式在第一阶段就把事务提交了,不需要在后面像 XA 一样继续持有数据库的锁,影响并发的性能。
五、总结
在分布式事务管理中,XA 事务与 TCC 模式各有特点和适用场景。
XA 事务是一种由 X/Open 组织提出的分布式交易处理规范,通过两阶段提交协议来保证数据的强一致性。它适用于单体架构,在并发量不大的时候性能较高,不需要远程的 API 调用。然而,XA 事务也存在一些缺点,如性能不好,无法满足高并发场景;存在同步阻塞问题,本地事务在 prepare 阶段锁定资源,影响系统性能;协调节点单点故障可能导致事务无限期等待;数据不一致风险较高等。
TCC 模式是一种业务层的两阶段提交方案,分为 Try、Confirm 和 Cancel 三个阶段。它具有高性能、灵活性强、不依赖数据库事务等优点,适用于分布式架构。在 TCC 模式中,由于事务被拆分为多个小的阶段,每个阶段只对部分资源进行操作,因此减少了锁的持有时间,提高了系统的并发性能。开发人员可以根据业务需求灵活地实现三个阶段的逻辑,更好地满足复杂业务场景的需求。同时,TCC 模式完全不依赖数据库的事务支持,而是通过业务逻辑的控制来实现事务的一致性,因此适用于非事务型数据库或者在分布式环境下跨数据库的事务处理。但是,TCC 模式也存在一些缺点,如代码入侵,需要人为编写 try、Confirm 和 Cancel 接口,增加了开发的难度和工作量,同时也对业务代码造成了一定的侵入性;存在软状态,事务最终一致,需考虑 Confirm 和 Cancel 的失败情况及幂等处理;可能出现事务悬挂和空回滚问题等。
综上所述,开发者在选择分布式事务管理方式时,需要根据实际情况进行权衡。如果系统并发量不大,且对数据强一致性要求较高,可以选择 XA 事务;如果系统是分布式架构,对性能要求较高,且能够接受最终一致性,可以选择 TCC 模式。
相关推荐
- 一个基于.Net Core遵循Clean Architecture原则开源架构
-
今天给大家推荐一个遵循CleanArchitecture原则开源架构。项目简介这是基于Asp.netCore6开发的,遵循CleanArchitecture原则,可以高效、快速地构建基于Ra...
- AI写代码翻车无数次,我发现只要提前做好这3步,bug立减80%
-
写十万行全是bug之后终于找到方法了开发"提示词管理助手"新版本那会儿,我差点被bug整崩溃。刚开始两周,全靠AI改代码架构,结果十万行程序漏洞百出。本来以为AI说没问题就稳了,结果...
- OneCode低代码平台的事件驱动设计:架构解析与实践
-
引言:低代码平台的事件驱动范式在现代软件开发中,事件驱动架构(EDA)已成为构建灵活、松耦合系统的核心范式。OneCode低代码平台通过创新性的注解驱动设计,将事件驱动理念深度融入平台架构,实现了业务...
- 国内大厂AI插件评测:根据UI图生成Vue前端代码
-
在IDEA中安装大厂的AI插件,打开ruoyi增强项目:yudao-ui-admin-vue31.CodeBuddy插件登录腾讯的CodeBuddy后,大模型选择deepseek-v3,输入提示语:...
- AI+低代码技术揭秘(二):核心架构
-
本文档介绍了为VTJ低代码平台提供支持的基本架构组件,包括Engine编排层、Provider服务系统、数据模型和代码生成管道。有关UI组件库和widget系统的信息,请参阅UI...
- GitDiagram用AI把代码库变成可视化架构图
-
这是一个名为gitdiagram的开源工具,可将GitHub仓库实时转换为交互式架构图,帮助开发者快速理解代码结构。核心功能一键可视化:替换GitHubURL中的"hub...
- 30天自制操作系统:第六天:代码架构整理与中断处理
-
1.拆开bootpack.c文件。根据设计模式将对应的功能封装成独立的文件。2.初始化pic:pic(可编程中断控制器):在设计上,cpu单独只能处理一个中断。而pic是将8个中断信号集合成一个中断...
- AI写代码越帮越忙?2025年研究揭露惊人真相
-
近年来,AI工具如雨后春笋般涌现,许多人开始幻想程序员的未来就是“对着AI说几句话”,就能轻松写出完美的代码。然而,2025年的一项最新研究却颠覆了这一期待,揭示了一个令人意外的结果。研究邀请了16位...
- 一键理解开源项目:两个自动生成GitHub代码架构图与说明书工具
-
一、GitDiagram可以一键生成github代码仓库的架构图如果想要可视化github开源项目:https://github.com/luler/reflex_ai_fast,也可以直接把域名替换...
- 5分钟掌握 c# 网络通讯架构及代码示例
-
以下是C#网络通讯架构的核心要点及代码示例,按协议类型分类整理:一、TCP协议(可靠连接)1.同步通信//服务器端usingSystem.Net.Sockets;usingTcpListene...
- 从复杂到优雅:用建造者和责任链重塑代码架构
-
引用设计模式是软件开发中的重要工具,它为解决常见问题提供了标准化的解决方案,提高了代码的可维护性和可扩展性,提升了开发效率,促进了团队协作,提高了软件质量,并帮助开发者更好地适应需求变化。通过学习和应...
- 低代码开发当道,我还需要学习LangChain这些框架吗?| IT杂谈
-
专注LLM深度应用,关注我不迷路前两天有位兄弟问了个问题:当然我很能理解这位朋友的担忧:期望效率最大化,时间用在刀刃上,“不要重新发明轮子”嘛。铺天盖地的AI信息轰炸与概念炒作,很容易让人浮躁与迷茫。...
- 框架设计并不是简单粗暴地写代码,而是要先弄清逻辑
-
3.框架设计3.框架设计本节我们要开发一个UI框架,底层以白鹭引擎为例。框架设计的第一步并不是直接撸代码,而是先想清楚设计思想,抽象。一个一个的UI窗口是独立的吗?不是的,...
- 大佬用 Avalonia 框架开发的 C# 代码 IDE
-
AvalonStudioAvalonStudio是一个开源的跨平台的开发编辑器(IDE),AvalonStudio的目标是成为一个功能齐全,并且可以让开发者快速使用的IDE,提高开发的生产力。A...
- 轻量级框架Lagent 仅需20行代码即可构建自己的智能代理
-
站长之家(ChinaZ.com)8月30日消息:Lagent是一个专注于基于LLM模型的代理开发的轻量级框架。它的设计旨在简化和提高这种模型下代理的开发效率。LLM模型是一种强大的工具,可以...
你 发表评论:
欢迎- 一周热门
- 最近发表
- 标签列表
-
- 框架图 (58)
- flask框架 (53)
- quartz框架 (51)
- abp框架 (47)
- springmvc框架 (49)
- 分布式事务框架 (65)
- scrapy框架 (56)
- shiro框架 (61)
- 定时任务框架 (56)
- java日志框架 (61)
- mfc框架 (52)
- abb框架断路器 (48)
- beego框架 (52)
- java框架spring (58)
- grpc框架 (65)
- tornado框架 (48)
- 前端框架bootstrap (54)
- orm框架有哪些 (51)
- 知识框架图 (52)
- ppt框架 (55)
- 框架图模板 (59)
- 内联框架 (52)
- cad怎么画框架 (58)
- ssm框架实现登录注册 (49)
- oracle字符串长度 (48)