首页 > 编程语言 >老榕树的Java专题:XA的二阶提交

老榕树的Java专题:XA的二阶提交

时间:2024-12-25 14:28:21浏览次数:11  
标签:事务 Java Seata Image XA 二阶 RM 日志 数据库

  1. XA(二阶提交)执行原理

    • 准备阶段(Prepare Phase)
      • 事务协调者(Transaction Coordinator,TC)向所有参与事务的资源管理器(Resource Manager,RM)发送准备请求。例如,在一个包含数据库 A 和数据库 B 的分布式事务中,TC 会分别向管理数据库 A 和数据库 B 的 RM 发送准备消息。
      • RM 接收到准备请求后,会执行本地事务操作,但并不提交。它会将事务执行过程中涉及的数据修改记录到本地的重做日志(Redo Log)和撤销日志(Undo Log)中。以数据库事务为例,它会锁住相关的数据行,执行 SQL 语句(如插入、更新或删除操作),并将这些操作记录下来。如果 RM 执行本地事务操作成功,就向 TC 返回 “准备就绪(Prepared)” 消息;如果执行失败,就返回 “失败(Abort)” 消息。
    • 提交阶段(Commit Phase)
      • 当 TC 收到所有 RM 返回的 “准备就绪” 消息后,它会向所有 RM 发送提交请求。此时,RM 收到提交请求后,会将本地事务真正提交,即将之前记录在重做日志中的数据修改持久化到数据库中。例如,将更新的数据写入数据文件,释放之前锁住的数据行等操作。
      • 如果在准备阶段,有任何一个 RM 返回 “失败” 消息,TC 就会向所有 RM 发送回滚请求。RM 收到回滚请求后,会利用撤销日志中的信息,将已经执行的本地事务操作撤销,恢复到事务开始之前的状态。
  2. AT 模式执行流程(以 Seata 框架为例)

    • 一阶段(执行本地事务)
      • 业务代码在执行 SQL 操作时,Seata 框架会拦截这些操作。例如,在一个服务调用多个数据库操作的场景中,当执行插入订单数据到订单数据库和更新库存数据到库存数据库的操作时,Seata 会为每个数据库操作生成一个本地事务。
      • 在执行本地事务过程中,Seata 会解析 SQL 语句,获取操作前后的数据镜像(Before Image 和 After Image)。Before Image 是操作前的数据快照,After Image 是操作后的数据快照。这些数据镜像会被保存起来,用于后续可能的回滚操作。同时,本地事务正常执行数据库操作,如插入、更新或删除记录。
      • 本地事务执行完成后,Seata 会向事务日志表中插入一条记录,记录这个本地事务的相关信息,包括事务 ID、分支事务类型(这里是 AT 模式)、操作的 SQL 语句等信息。这个事务日志表是 Seata 用于管理分布式事务的关键数据表。
    • 二阶段(提交或回滚)
      • 提交情况:如果一阶段所有本地事务都执行成功,Seata 会根据事务日志中的记录,异步删除之前保存的 Before Image 和 After Image 数据,因为事务已经成功提交,这些数据快照不再需要。同时,事务日志表中的相关记录也可以在合适的时候被清理,完成整个分布式事务的提交过程。
      • 回滚情况:如果在一阶段有本地事务执行失败,或者业务逻辑判断需要回滚事务,Seata 会根据事务日志中的 Before Image 数据,对已经执行的本地事务进行回滚操作。它会将数据库中的数据恢复到 Before Image 记录的状态,从而保证整个分布式事务的一致性。例如,如果在更新库存数据时出现问题,Seata 会利用 Before Image 将库存数据恢复到更新之前的状态,同时清理事务日志中的相关记录。

标签:事务,Java,Seata,Image,XA,二阶,RM,日志,数据库
From: https://blog.csdn.net/m0_62890527/article/details/144719012

相关文章

  • 老榕树的Java专题:知识分享(持续更新)
    1、线程的创建:        callable方式://创建一个类publicclassThreadTest{ //这里只是用于测试,正常开发中很少有这样的main执行的publicstaticmain(Stringargs[]){  //创建callable类Callable<String>call=newMyCallable();......
  • Java程序员面试前怎么准备才能从容应对当下的面试?
    现在互联网大环境不好,互联网公司纷纷裁员并缩减HC,更多程序员去竞争更少的就业岗位,整的IT行业越来越卷。身为Java程序员的我们就更不用说了,上班8小时需要做好本职工作,下班后还要不断提升技能、技术栈,才能从容应对现在互联网公司的面试!但事实是:很多Java程序员,对自身是没有一个清......
  • Java程序员如何获取高并发经验?
    现在好点的互联网公司招聘基本都要求有高并发经验,但没有高并发的经验的人感觉只有在好点的互联网才获得高并发经验,这难道不是死循环?没有高并发经验的人如何才能获取高并发方面的经验呢?如何获取高并发经验?其实并不是去了大公司就能获得高并发的经验,高并发只是一个结果,并不是过......
  • 【Java开发】如何设计一个全局唯一的订单号?
    一、背景介绍二、方案实践2.1方案一:UUID2.2方案二:数据库自增2.3方案三:雪花算法2.4方案四:分布式组件总结一、背景介绍在实际的软件系统开发过程中,由于业务的需要,我们经常需要生成业务单号,例如订单编号、入库单号、投诉服务单号等等,针对这个问题也做......
  • java~重写hashcode时为什么要乘以31
    在Java中,重写hashCode()方法时常常会使用31作为乘数,这是因为31具有一些独特的数学性质,使其成为一个优秀的选择。以下是几个原因:1.奇质数的特性31是一个奇数和质数,这意味着它能有效地减少哈希冲突的概率。使用质数作为乘数可以帮助分散哈希值,从而提高哈希表的性能。2.位运算效......
  • 全国消费水平系统|Java|SSM|JSP| 
                            【技术栈】1⃣️:架构:B/S、MVC2⃣️:系统环境:Windowsh/Mac3⃣️:开发环境:IDEA、JDK1.8、Maven、Mysql5.7+4⃣️:技术栈:Java、Mysql、SSM、Mybatis-Plus、JSP、jquery,html5⃣️数据库可视化工具:navicat6⃣️服......
  • 详细介绍 JavaScript 数组的常用方法
     1.数组元素访问和修改方法constarr=['a','b','c'];//添加/删除元素arr.push('d');//末尾添加元素,返回新长度arr.pop();//删除最后一个元素,返回被删除的元素arr.unshift('x');//开头添加元素,返回新长度arr.shift();......
  • 贪心算法之分发糖果--附java完整代码
    leetcode135.分发糖果classSolution{/**分两个阶段1、起点下标1从左往右,只要右边比左边大,右边的糖果=左边+12、起点下标ratings.length-2从右往左,只要左边比右边大,此时左边的糖果应该取本身的糖果数(符合比它......
  • 通过Java Bean Validation API
    通过JavaBeanValidationAPI的验证,对字符串、集合、数组等对象的大小进行验证。(如:通过限制参数的大小,来防止SQL注入)1、添加依赖<!--HibernateValidator--><dependency><groupId>org.hibernate.validator</groupId><artifactId>hibernate-validator</artifactI......
  • Unix和Linux有什么区别?思维导图 代码示例(java 架构)
    Unix和Linux之间存在一些历史和实际使用上的区别。Unix是一种多用户、多任务的操作系统,它由AT&T的贝尔实验室在1960年代末期开发。Linux则是一个类Unix操作系统内核,由LinusTorvalds在1991年首次发布,并且是开源的。以下是它们之间的一些主要区别:Unix和Linux的......