当前位置: 首页 > news >正文

Spring Cloud Alibaba Seata 分布式事务(六)

目录

一 基础概念

二 介绍

二 实际使用

1 找到对应的文件

2 打开bin 目录

3 开启终端

4 可视化界面

四 二阶提交协议流程

(1)一阶段:准备阶段(Prepare)

(2)二阶段:提交或回滚阶段(Commit / Rollback)


一 基础概念

特性描述
目标解决微服务架构下的数据一致性问题
核心角色TC(协调器)、TM(管理器)、RM(资源管理器)
主流模式AT 模式(无侵入、自动补偿)、TCC模式(高性能、需编码)
使用方式1. 部署Seata-Server;2. 添加依赖;3. 使用@GlobalTransactional注解
优势对代码侵入性低(AT模式),与Spring Cloud Alibaba生态(Nacos, Sentinel)无缝集成,提供了多种模式适应不同场景

简单来说,Seata 通过一个简单的注解和一套巧妙的“回滚日志”机制,帮你透明地解决了最令人头疼的分布式事务问题,是你构建微服务系统时非常值得考虑的基础组件。

二 介绍

Seata的架构包括三个核心角色

TM = 事务发起人,RM = 事务执行者,TC = 总裁判/协调者

  1. TC (Transaction Coordinator) - 事务协调器:维护全局和分支事务的状态,驱动全局事务提交或回滚。

  2. TM (Transaction Manager) - 事务管理器:定义全局事务的范围,开始全局事务、提交或回滚全局事务。

  3. RM (Resource Manager) - 资源管理器:管理分支事务处理的资源,与TC交谈以注册分支事务和报告分支事务的状态,并驱动分支事务提交或回滚。

二 实际使用

Seata-Server Release History | Apache Seata

1 找到对应的文件

2 打开bin 目录

3 开启终端

使用管理员身份开启终端

./seata-server.bat

4 可视化界面

账号密码都是seata

依赖:

      <dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-seata</artifactId><version>2023.0.3.2</version></dependency>

导入成功

配置文件:

transport {# tcp udt unix-domain-sockettype = "TCP"#NIO NATIVEserver = "NIO"#enable heartbeatheartbeat = true# the client batch send request enableenableClientBatchSendRequest = true#thread factory for nettythreadFactory {bossThreadPrefix = "NettyBoss"workerThreadPrefix = "NettyServerNIOWorker"serverExecutorThread-prefix = "NettyServerBizHandler"shareBossWorker = falseclientSelectorThreadPrefix = "NettyClientSelector"clientSelectorThreadSize = 1clientWorkerThreadPrefix = "NettyClientWorkerThread"# netty boss thread size,will not be used for UDTbossThreadSize = 1#auto default pin or 8workerThreadSize = "default"}shutdown {# when destroy server, wait secondswait = 3}serialization = "seata"compressor = "none"
}
service {#transaction service group mappingvgroup_mapping.tx = "default"#only support when registry.type=file, please don't set multiple addressesdefault.grouplist = "127.0.0.1:8091"#degrade, current not supportenableDegrade = false#disable seatadisableGlobalTransaction = false
}client {rm {asyncCommitBufferLimit = 10000lock {retryInterval = 10retryTimes = 30retryPolicyBranchRollbackOnConflict = true}reportRetryCount = 5tableMetaCheckEnable = falsereportSuccessEnable = false}tm {commitRetryCount = 5rollbackRetryCount = 5}undo {dataValidation = truelogSerialization = "jackson"logTable = "undo_log"}log {exceptionRate = 100}
}

注解:@GlobalTransacyional

    @SentinelResource(value = "createOrder", blockHandler = "createOrderFallback")@GlobalTransactional@Overridepublic Order createOrder(Long productId, Long userId) {// Product product = getProductFromRemote3(productId);Product product = productFeignClient.getProductById(productId);Order order = new Order();order.setId(1L);// 远程调用计算商品数额order.setTotalAmount(product.getPrice().multiply(new BigDecimal(product.getNum())));order.setUserId(userId);order.setNickName("张三");order.setAddress("青岛");// 远程调用获取商品信息order.setProductList(Arrays.asList(product));return order;}

四 二阶提交协议流程

Seata 的 2PC 协议流程

(1)一阶段:准备阶段(Prepare)

  • TM(事务管理器) 发起一个全局事务请求,向 TC(事务协调器) 注册一个 全局事务 ID(XID)

  • 业务服务在调用时,RM(资源管理器) 会向 TC 注册分支事务。

  • 每个分支事务在本地数据库中执行 业务 SQL,但 不会真正提交,而是:

    • 前镜像(before image)后镜像(after image) 保存到 undo_log 表,用于回滚时恢复。

    • 把执行结果(是否成功)上报给 TC

 阶段一的目标:锁定资源(行锁)+ 保证可回滚。此时业务 SQL 已经执行,但结果还没对外可见(本地事务未提交)。


(2)二阶段:提交或回滚阶段(Commit / Rollback)

  • TC 收到所有 RM 的反馈后:

    • 如果所有分支事务都成功 → 发出 Commit 请求

      • RM 删除对应的 undo_log 日志。

      • 本地事务提交,数据正式生效。

    • 如果有一个分支事务失败 → 发出 Rollback 请求

      • RM 根据 undo_logbefore image 回滚数据。

      • 释放锁资源,事务一致性恢复。

 阶段二的目标:根据全局事务状态,最终决定各分支事务是 提交 还是 回滚

http://www.dtcms.com/a/360083.html

相关文章:

  • CPTS---Hospital
  • AliceVision相比于OpenMVG、Colmap有什么区别和特点
  • 计算机毕设选题:基于Python+Django实现电商评论情感分析系统
  • 嵌入式ARM程序高级调试技能:20.qemu arm ARM Linux 上 addr2line 的实际应用示例
  • 常用定位技术对比解析
  • OpenCL C 命令队列
  • 点接触混合润滑完整数值解
  • Photoshop - Ps 标尺
  • PortSwigger靶场之DOM XSS in document.write sink using source location.search通关秘籍
  • [ Android Audio 篇 ] 高通平台 Android AudioRecord 多通道录音
  • 手写call函数【JavaScript】
  • Java多线程基础:进程、线程与线程安全实战
  • 《信息学奥林匹克辞典》中的一个谬误
  • 【Android】Notification 的基本使用
  • C++ 快速复习指南(上半部分)
  • 房屋租赁系统|基于SpringBoot和Vue的房屋租赁系统(源码+数据库+文档)
  • 8.31【Q】CXL-DMSim:
  • 数学分析原理答案——第七章 习题12
  • 设置Ubuntu 22.04 LTS上的rsync同步服务
  • Hysplit大气传输和污染扩散-轨迹聚合标准20%30%用途
  • 国内大型银行数据模型实践案例
  • PerfectSquares.java
  • 解决COB支架偏移载具分析问题根源
  • 编译器领域 名人堂
  • 单表查询-group by rollup优化
  • ibping基本使用 以及 包丢失 超时 排障
  • 【GPT入门】第62课 情感对话场景模型选型、训练与评测方法,整体架构设计
  • Redis核心原理与Java应用实践
  • 基于Seurat的空转单样本数据分析流程学习(一)
  • 性能优化三剑客:`memo`, `useCallback`, `useMemo` 详解