当前位置: 首页 > 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.xdnf.cn/news/1414783.html

相关文章:

  • 索引性能分析
  • 【开题答辩全过程】以 基于SSM的拾光咖啡厅管理系统的设计与实现为例,包含答辩的问题和答案
  • Nano Banana:下一代AI图像创作与编辑指南
  • Linux网络编程04:网络基础(万字图文解析)
  • AFSIM仿真脚本生成(三)脚本解析技术加速验证过程
  • 有关指针的认知盲区:指针大小,决定因素,指针变量
  • EtherCAT主站IGH-- 44 -- IGH之slave_config.h/c文件解析
  • 目标检测算法YOLOv4详解
  • Langchain指南-关键特性:使用聊天模型调用工具
  • 用 MATLAB 实现遗传算法求解一元函数极值:从代码到实践
  • STL常见容器介绍
  • 从RNN到Transformer
  • @Transactional如何对分布式事务生效
  • Redis实现短信登录
  • 需要固定一个指针,再遍历另一个指针的都可以用双指针方法
  • 【系列11】端侧AI:构建与部署高效的本地化AI模型 第10章:LLM端侧部署
  • 二.Shell脚本编程
  • 在AlmaLinux或CentOS 8上编译安装ZLMediaKit流媒体服务器
  • CatBoost vs XGBoost:两大Boosting框架的全面对比
  • HTML5国庆网站源码
  • gdsfactory安装以及和klayout联调
  • 自学嵌入式第三十一天:Linux系统编程-进程间通信
  • 《程序员修炼之道》第七八九章读书笔记
  • Asible管理变量和事实和实施任务控制
  • 新手首次操作SEO核心要点
  • 深度学习周报(8.25~8.31)
  • 雪花算法生成分布式ID
  • C++ STL之哈希封装实现unordered_map/set
  • 第4章从一条记录说起-InnoDB记录结构
  • Redis六大常见命令详解:从set/get到过期策略的全方位解析