seata实操案例
从Docker启动Seata到Spring Boot集成再通过一个订单-库存-账户的电商场景把AT、TCC、SAGA、XA这四种模式的配置和用法都串一遍。一、环境与版本说明以下示例基于Spring Boot 3.2.5 Seata 1.8.0这是官方明确支持Spring Boot 3的组合。如果你用的是Spring Boot 2.xSeata 1.4~1.6也都可以。组件规划Seata ServerTCDocker部署注册到Nacos三个微服务order-service订单、stock-service库存、account-service账户注册中心Nacos 2.3.2数据库MySQL 8.0每个服务有自己的库二、Seata Server Docker部署2.1 拉取并启动临时获取配置dockerpull seataio/seata-server:1.8.0# 临时启动只是为了拷贝配置文件出来dockerrun-d-p8091:8091-p7091:7091--nameseata-temp seataio/seata-server:1.8.0# 拷贝配置到宿主机mkdir-p/docker/seata/configdockercpseata-temp:/seata-server/resources /docker/seata/configdockerrm-fseata-temp2.2 修改配置application.yml关键配置是注册中心和存储模式server:port:7091seata:registry:type:nacosnacos:server-addr:172.17.0.1:8848# 容器内访问宿主机Nacos的IPnamespace:publicgroup:SEATA_GROUPcluster:defaultconfig:type:nacosnacos:server-addr:172.17.0.1:8848namespace:publicgroup:SEATA_GROUPdata-id:seataServer.propertiesstore:mode:db# 生产环境用db测试用file也行db:datasource:druiddb-type:mysqldriver-class-name:com.mysql.cj.jdbc.Driverurl:jdbc:mysql://172.17.0.1:3306/seata_server?useUnicodetruecharacterEncodingutf8user:rootpassword:1234562.3 正式启动dockerrun-d\--nameseata-server\-p8091:8091\-p7091:7091\-v/docker/seata/config/resources:/seata-server/resources\seataio/seata-server:1.8.0⚠️注意如果用file模式存储事务日志存本地文件Server重启后事务状态会丢失。生产环境务必用db模式。三、Spring Boot 项目集成通用步骤3.1 引入依赖每个微服务的pom.xml都要加!-- Seata Spring Boot Starter --dependencygroupIdio.seata/groupIdartifactIdseata-spring-boot-starter/artifactIdversion1.8.0/version/dependency!-- Spring Cloud Alibaba Seata如果用了Spring Cloud --dependencygroupIdcom.alibaba.cloud/groupIdartifactIdspring-cloud-starter-alibaba-seata/artifactIdversion2023.0.1.0/versionexclusionsexclusiongroupIdio.seata/groupIdartifactIdseata-spring-boot-starter/artifactId/exclusion/exclusions/dependency!-- Nacos 服务发现 --dependencygroupIdcom.alibaba.cloud/groupIdartifactIdspring-cloud-starter-alibaba-nacos-discovery/artifactId/dependency这里排除了spring-cloud-starter-alibaba-seata自带的Seata版本用我们指定的1.8.0避免版本冲突。3.2 配置文件application.ymlspring:application:name:order-servicedatasource:url:jdbc:mysql://localhost:3306/order_db?useUnicodetruecharacterEncodingutf8username:rootpassword:123456driver-class-name:com.mysql.cj.jdbc.Driverseata:enabled:trueapplication-id:${spring.application.name}tx-service-group:my_tx_group# 事务组名service:vgroup-mapping:my_tx_group:default# 映射到Seata Server的clusterregistry:type:nacosnacos:server-addr:localhost:8848namespace:publicgroup:SEATA_GROUPconfig:type:nacosnacos:server-addr:localhost:8848namespace:publicgroup:SEATA_GROUPdata-source-proxy-mode:AT# 默认AT也可改为XA关键点tx-service-group要跟Seata Server端配置的vgroupMapping对应上。四、数据库准备AT/XA模式必需AT和XA模式依赖undo_log表每个业务数据库都要创建CREATETABLEundo_log(idBIGINT(20)NOTNULLAUTO_INCREMENT,branch_idBIGINT(20)NOTNULL,xidVARCHAR(100)NOTNULL,contextVARCHAR(128)NOTNULL,rollback_infoLONGBLOBNOTNULL,log_statusINT(11)NOTNULL,log_createdDATETIMENOTNULL,log_modifiedDATETIMENOTNULL,PRIMARYKEY(id),UNIQUEKEYux_undo_log(xid,branch_id))ENGINEInnoDBDEFAULTCHARSETutf8;Seata Server自己的库还需要global_table、branch_table、lock_table三张表从官方GitHub的script/server/db目录获取。五、AT模式最常用无侵入AT模式是Seata的默认模式对业务代码零侵入。5.1 配置application.yml中已设置seata.data-source-proxy-mode: AT默认就是AT不配也行。5.2 代码示例订单服务 - 发起方TMServicepublicclassOrderService{AutowiredprivateStockFeignClientstockFeignClient;AutowiredprivateAccountFeignClientaccountFeignClient;AutowiredprivateOrderMapperorderMapper;GlobalTransactional(namecreate-order,rollbackForException.class)publicvoidcreateOrder(OrderDTOorder){// 1. 本地创建订单orderMapper.insert(order);// 2. 远程扣减库存调用stock-servicestockFeignClient.deductStock(order.getProductId(),order.getQuantity());// 3. 远程扣减账户余额调用account-serviceaccountFeignClient.decreaseBalance(order.getUserId(),order.getAmount());}}库存服务 - 参与方RMServicepublicclassStockService{AutowiredprivateStockMapperstockMapper;// 普通本地事务即可Seata会自动代理DataSourceTransactionalpublicvoiddeductStock(LongproductId,Integerquantity){StockstockstockMapper.selectByProductId(productId);if(stock.getStock()quantity){thrownewRuntimeException(库存不足);}stock.setStock(stock.getStock()-quantity);stockMapper.updateById(stock);}}AT模式原理一阶段执行SQL时自动生成undo_log记录修改前后镜像二阶段如果成功则异步清理undo_log如果失败则根据undo_log自动回滚。六、TCC模式高性能需编码TCC需要手动实现Try预留、Confirm确认、Cancel取消三个方法。6.1 配置seata:data-source-proxy-mode:AT# TCC不需要改这个跟AT共用即可6.2 定义TCC接口LocalTCCpublicinterfaceAccountTCCService{TwoPhaseBusinessAction(namedecreaseBalance,commitMethodconfirm,rollbackMethodcancel)voidtryDecreaseBalance(BusinessActionContextParameter(paramNameuserId)LonguserId,BusinessActionContextParameter(paramNameamount)BigDecimalamount);voidconfirm(BusinessActionContextcontext);voidcancel(BusinessActionContextcontext);}6.3 实现TCC逻辑ServicepublicclassAccountTCCServiceImplimplementsAccountTCCService{AutowiredprivateAccountMapperaccountMapper;OverrideTransactionalpublicvoidtryDecreaseBalance(LonguserId,BigDecimalamount){// Try阶段检查余额并冻结预留资源AccountaccountaccountMapper.selectByUserId(userId);if(account.getBalance().compareTo(amount)0){thrownewRuntimeException(余额不足);}// 将可用余额减少冻结金额增加account.setFrozen(account.getFrozen().add(amount));account.setBalance(account.getBalance().subtract(amount));accountMapper.updateById(account);}OverrideTransactionalpublicvoidconfirm(BusinessActionContextcontext){// Confirm阶段真正扣减释放冻结LonguserIdLong.valueOf(context.getActionContext(userId).toString());BigDecimalamountnewBigDecimal(context.getActionContext(amount).toString());AccountaccountaccountMapper.selectByUserId(userId);account.setFrozen(account.getFrozen().subtract(amount));accountMapper.updateById(account);}OverrideTransactionalpublicvoidcancel(BusinessActionContextcontext){// Cancel阶段回滚释放冻结恢复余额LonguserIdLong.valueOf(context.getActionContext(userId).toString());BigDecimalamountnewBigDecimal(context.getActionContext(amount).toString());AccountaccountaccountMapper.selectByUserId(userId);account.setFrozen(account.getFrozen().subtract(amount));account.setBalance(account.getBalance().add(amount));accountMapper.updateById(account);}}6.4 发起方调用ServicepublicclassOrderService{AutowiredprivateAccountTCCServiceaccountTCCService;GlobalTransactionalpublicvoidcreateOrder(OrderDTOorder){// ... 订单创建 ...// 调用TCC服务accountTCCService.tryDecreaseBalance(order.getUserId(),order.getAmount());}}TCC不依赖数据库事务性能最好但开发成本高适合资金扣减等核心场景。七、SAGA模式长事务流程编排SAGA适合流程长、步骤多的场景通过状态机或注解方式编排正向操作和补偿操作。7.1 引入依赖dependencygroupIdio.seata/groupIdartifactIdseata-saga-starter/artifactIdversion1.8.0/version/dependency7.2 定义状态机JSONresources/statelang/order_saga.json{name:orderSaga,startState:CreateOrder,states:{CreateOrder:{type:ServiceTask,serviceName:orderService,serviceMethod:createOrderLocal,compensateMethod:cancelOrderLocal,next:DeductStock,catch:[{exceptions:[java.lang.Exception],next:Failure}]},DeductStock:{type:ServiceTask,serviceName:stockService,serviceMethod:deductStockLocal,compensateMethod:restoreStockLocal,next:DecreaseBalance,catch:[{exceptions:[java.lang.Exception],next:Failure}]},DecreaseBalance:{type:ServiceTask,serviceName:accountService,serviceMethod:decreaseBalanceLocal,compensateMethod:increaseBalanceLocal,next:Success,catch:[{exceptions:[java.lang.Exception],next:Failure}]},Success:{type:Fail,end:true},Failure:{type:Fail,end:true}}}7.3 发起SAGA事务ServicepublicclassOrderSagaService{AutowiredprivateStateMachineEnginestateMachineEngine;GlobalTransactionalpublicvoidcreateOrder(OrderDTOorder){MapString,ObjectparamsnewHashMap();params.put(order,order);// 启动状态机stateMachineEngine.start(orderSaga,null,params);}}SAGA模式的官方示例可参考 seata-samples 项目。八、XA模式强一致依赖数据库XA模式利用数据库自身的XA协议强一致性但性能较低。8.1 配置seata:data-source-proxy-mode:XA# 改为XA模式8.2 代码跟AT几乎一样ServicepublicclassOrderService{GlobalTransactionalpublicvoidcreateOrder(OrderDTOorder){orderMapper.insert(order);stockFeignClient.deductStock(order.getProductId(),order.getQuantity());accountFeignClient.decreaseBalance(order.getUserId(),order.getAmount());}}XA模式代码跟AT一样无侵入但性能最差锁资源时间长适合对一致性要求极高、并发不高的场景。九、四种模式配置对比模式data-source-proxy-mode额外依赖额外建表代码侵入ATAT默认无undo_log每个业务库无TCCAT或TCC无无高需实现3个方法SAGAATseata-saga-starter无中需定义状态机XAXA无undo_log每个业务库无十、完整Demo参考如果想直接看完整可运行的项目可以参考官方示例seata-samples — 包含各模式的Spring Boot示例社区实战yimo-seata-samples — 同一项目中混合使用AT和TCC模式CSDN教程SpringBoot3.2.5整合Seata1.8.0详细教程 — 完整可运行代码 实操建议先用AT模式跑通代码改动最小快速验证链路遇到锁冲突调大client.rm.lock.retry.timeout参数跨服务XID传递用Feign时spring-cloud-starter-alibaba-seata会自动传递XID不用额外处理生产环境Seata Server至少部署3个节点存储用DB模式

相关新闻

微服务架构--gateway要做的事情

微服务架构--gateway要做的事情

了解gateway 我们从4个角度去理解 1.对搭建部署,架构层面有一定量的理解 2.理解gateway提供的一整套知识体系 3.gateway在实际项目中,需要整合的其他的技术栈 4.gateway在实际项目中的,灵活使用 1.对搭建部署,架构层面有一定量的理…

2026/7/13 21:07:58阅读更多 →
微服务开发--nacos实战,程序员要做的所有事情

微服务开发--nacos实战,程序员要做的所有事情

回顾技术栈 如果我们要去进行微服务开发 我们需要做什么 从0到1阶段 1.拉取docker对应的nacos运行起来,打开仪表盘面板 2.设计微服务包结构,看是否需要是设计公共模块 3.对对应的springboot相关的文件夹,引入配置,处理连接&#x…

2026/7/13 21:07:58阅读更多 →
后端开发流程ai化实践思路

后端开发流程ai化实践思路

我们作为开发者 想一下,整个开发节奏和流程 梳理一下 然后,在看一下哪些步骤,可以交给ai去做 怎么交给ai去做,需要在本地软件,配置哪些内容 1.整理这个需求所有的信息量,聚合在一起 对要写的代码产生需求端…

2026/7/13 21:07:58阅读更多 →
如何将Kimodo-SOMA-RP-v1.1集成到现有动画工作流中:完整指南

如何将Kimodo-SOMA-RP-v1.1集成到现有动画工作流中:完整指南

如何将Kimodo-SOMA-RP-v1.1集成到现有动画工作流中:完整指南 【免费下载链接】Kimodo-SOMA-RP-v1.1 项目地址: https://ai.gitcode.com/hf_mirrors/nvidia/Kimodo-SOMA-RP-v1.1 Kimodo-SOMA-RP-v1.1是一款强大的3D骨骼动画生成工具,能够通过文本…

2026/7/13 22:03:01阅读更多 →
3天快速掌握RKNN-Toolkit2:嵌入式AI模型部署的终极指南

3天快速掌握RKNN-Toolkit2:嵌入式AI模型部署的终极指南

3天快速掌握RKNN-Toolkit2:嵌入式AI模型部署的终极指南 【免费下载链接】rknn-toolkit2 项目地址: https://gitcode.com/gh_mirrors/rkn/rknn-toolkit2 想要将训练好的AI模型轻松部署到嵌入式设备上?RKNN-Toolkit2正是你需要的强大工具&#xff…

2026/7/13 22:03:01阅读更多 →
Ino 项目常见问题解决方案

Ino 项目常见问题解决方案

Ino 项目常见问题解决方案 【免费下载链接】ino Command line toolkit for working with Arduino hardware 项目地址: https://gitcode.com/gh_mirrors/in/ino 项目基础介绍 Ino 是一个基于命令行的 Arduino 硬件开发工具包。它允许用户快速创建新项目、从多个源文件和…

2026/7/13 22:03:01阅读更多 →
Docker学习篇

Docker学习篇

目录一、CentOS7下载docker二、docker常用命令1. 启动类命令2. 镜像命令3.容器命令3.1新建/启动容器3.2查看容器3.2退出容器3.3启动停止容器3.4后台启动容器3.5镜像命令3.5.1提交镜像4.软件安装4.1docker安装MySQL4.2docke安装redis4.2.1客户端连接不到redis,修改re…

2026/7/13 22:03:01阅读更多 →
从零开始:使用MLX-OptiQ工具包量化大型语言模型的完整流程

从零开始:使用MLX-OptiQ工具包量化大型语言模型的完整流程

从零开始:使用MLX-OptiQ工具包量化大型语言模型的完整流程 【免费下载链接】gemma-4-e2b-it-OptiQ-4bit 项目地址: https://ai.gitcode.com/hf_mirrors/mlx-community/gemma-4-e2b-it-OptiQ-4bit MLX-OptiQ工具包是一款专为Apple Silicon设计的高效大型语言…

2026/7/13 22:03:01阅读更多 →
Kornia 和 TorchIO 是两个面向不同目标的 PyTorch 生态医学影像处理库

Kornia 和 TorchIO 是两个面向不同目标的 PyTorch 生态医学影像处理库

Kornia 和 TorchIO 是两个面向不同目标的 PyTorch 生态医学影像处理库,常被混淆但定位差异显著:Kornia: 是一个基于 PyTorch 的计算机视觉函数库(“OpenCV for PyTorch”),核心聚焦于可微分图像变换&#x…

2026/7/13 21:58:01阅读更多 →
VSCode TypeScript 环境配置对比:全局安装 vs 项目本地安装的4个关键差异

VSCode TypeScript 环境配置对比:全局安装 vs 项目本地安装的4个关键差异

VSCode TypeScript 环境配置对比:全局安装 vs 项目本地安装的4个关键差异当你在VSCode中启动一个新的TypeScript项目时,第一个技术决策往往从安装方式开始。这个看似简单的选择——全局安装还是项目本地安装——实际上会深刻影响你的开发流程、团队协作和…

2026/7/13 4:47:19阅读更多 →
智慧树刷课插件:5分钟实现自动化学习的智能助手

智慧树刷课插件:5分钟实现自动化学习的智能助手

智慧树刷课插件:5分钟实现自动化学习的智能助手 【免费下载链接】zhihuishu 智慧树刷课插件,自动播放下一集、1.5倍速度、无声 项目地址: https://gitcode.com/gh_mirrors/zh/zhihuishu 智慧树刷课插件是一款专为智慧树在线教育平台设计的Chrome浏…

2026/7/13 0:50:34阅读更多 →
Steam创意工坊下载器WorkshopDL:跨平台游戏模组获取的终极解决方案

Steam创意工坊下载器WorkshopDL:跨平台游戏模组获取的终极解决方案

Steam创意工坊下载器WorkshopDL:跨平台游戏模组获取的终极解决方案 【免费下载链接】WorkshopDL WorkshopDL - The Best Steam Workshop Downloader 项目地址: https://gitcode.com/gh_mirrors/wo/WorkshopDL 你是否在GOG或Epic Games Store购买了心仪的游戏…

2026/7/13 4:52:09阅读更多 →
卡梅德生物技术快报|蛋白质分离纯化:肠激酶可溶性原核表达 + 两步层析全参数|标准化蛋白质分离纯化 SOP

卡梅德生物技术快报|蛋白质分离纯化:肠激酶可溶性原核表达 + 两步层析全参数|标准化蛋白质分离纯化 SOP

研究痛点提出(提出问题)重组肠激酶是融合标签切除核心工具酶,当前原核表达体系存在三大标准化难题,直接阻碍可复现的蛋白质分离纯化流程搭建:Trx、GST、单 SUMO 标签融合产物绝大多数为包涵体,沉淀占比超 9…

2026/7/13 0:04:58阅读更多 →
语音转文字工具AsrTools:让音频整理变得简单高效

语音转文字工具AsrTools:让音频整理变得简单高效

语音转文字工具AsrTools:让音频整理变得简单高效 【免费下载链接】AsrTools ✨ AsrTools: Smart Voice-to-Text Tool | Efficient Batch Processing | User-Friendly Interface | No GPU Required | Supports SRT/TXT Output | Turn your audio into accurate text …

2026/7/13 0:04:58阅读更多 →
Palworld存档编辑完全掌握:从零开始实现游戏数据可视化修改

Palworld存档编辑完全掌握:从零开始实现游戏数据可视化修改

Palworld存档编辑完全掌握:从零开始实现游戏数据可视化修改 【免费下载链接】palworld-save-tools Tools for converting Palworld .sav files to JSON and back 项目地址: https://gitcode.com/gh_mirrors/pa/palworld-save-tools 你是否曾经想要调整Palwor…

2026/7/13 0:04:58阅读更多 →
YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

如果你在部署 YOLOv8 时,发现推理速度只有可怜的 1-2 FPS,而别人的演示视频却能跑到 30 FPS 以上,那么问题很可能不在模型本身,而在于你的整个处理链路。很多开发者拿到一个训练好的 YOLOv8 模型后,会直接使用官方示例…

2026/7/13 4:21:17阅读更多 →
Coze与Dify对比指南:低代码AI应用开发从入门到实战

Coze与Dify对比指南:低代码AI应用开发从入门到实战

1. 从零到一:为什么你需要了解 Coze 和 Dify?如果你对 AI 应用开发感兴趣,但一看到“大模型”、“智能体”、“工作流”这些词就头疼,觉得门槛太高,那这篇文章就是为你准备的。很多开发者,包括我自己&#…

2026/7/13 4:08:53阅读更多 →
AI生图工具怎么选?2026年6月版实测对比

AI生图工具怎么选?2026年6月版实测对比

做自媒体的朋友应该都有体会:配图一直是个让人头疼的问题。2026年,AI生图工具已经非常成熟了,但工具太多反而不知道怎么选。以下是截至2026年6月我对主流AI生图工具的实测对比。Midjourney V8.1:速度之王2026年6月11日&#xff0c…

2026/7/12 21:43:43阅读更多 →