一、Seata 核心概念解决微服务跨库调用分布式事务一致性问题主流AT自动事务模式无侵入业务代码改动极小。三大角色TC 事务协调器独立服务全局事务管理者记录全局锁、事务状态、触发提交/回滚TM 事务管理器发起全局事务入口服务加注解GlobalTransactionalRM 资源管理器每个参与事务的微服务分支事务执行、上报状态、释放锁。二、Windows 部署 Seata TC可选 注册到Nacos1. 下载解压下载地址官网下载 seata-server 压缩包解压路径无中文空格示例D:\soft\seata-1.8.0。2. 修改注册配置文件 registry.confregistry { type nacos nacos { application seata-server serverAddr 127.0.0.1:8848 group DEFAULT_GROUP namespace public cluster default } } config { type nacos nacos { serverAddr 127.0.0.1:8848 group DEFAULT_GROUP namespace public } }3. 修改 store.mode存储模式file.confstore { mode db # 生产用db默认file重启事务数据丢失 db { datasource druid druid { url jdbc:mysql://127.0.0.1:3306/seata_tc?useUnicodetrue user root password 你的密码 driverClassName com.mysql.cj.jdbc.Driver } } }4. 初始化TC库表新建库seata_tc执行 seata 目录下script/server/db/mysql.sql建表。5. 启动TCcmd 进入 binseata-server.batNacos 服务列表出现seata-serverTC注册成功。三、每个参与分布式事务的业务库必须建undo_log表每个微服务自己的业务库执行下面SQLCREATETABLEundo_log(idbigintNOTNULLAUTO_INCREMENT,branch_idbigintNOTNULL,xidvarchar(128)NOTNULL,contextvarchar(128)NOTNULL,rollback_infolongblobNOTNULL,log_statusintNOTNULL,log_createddatetimeNOTNULL,log_modifieddatetimeNOTNULL,PRIMARYKEY(id),UNIQUEKEYux_undo_log(xid,branch_id))ENGINEInnoDBDEFAULTCHARSETutf8mb4;AT模式依靠undo_log生成回滚快照必须每张业务库单独建。四、微服务客户端接入1. 依赖所有参与分布式事务的微服务都引入dependencygroupIdcom.alibaba.cloud/groupIdartifactIdspring-cloud-starter-alibaba-seata/artifactId/dependency2. application.yml 统一配置spring:cloud:alibaba:seata:tx-service-group:my_tx_group# 自定义事务组名nacos:discovery:server-addr:127.0.0.1:8848额外补充在Nacos配置中心新建配置Data IDseata.propertiesservice.vgroupMapping.my_tx_groupdefaultmy_tx_group对应上面tx-service-groupdefault是TC集群名。五、AT模式代码场景举例下单服务order→ 扣库存stock→ 扣余额account任意下游抛出异常所有库同时回滚。1. 事务发起方Order服务 TM全局事务注解GlobalTransactionalServicepublicclassOrderServiceImplimplementsOrderService{AutowiredprivateStockFeignClientstockFeignClient;AutowiredprivateAccountFeignClientaccountFeignClient;OverrideGlobalTransactional(rollbackForException.class)// 开启全局事务publicvoidcreateOrder(LonguserId,LonggoodsId,Integernum){// 1. 新增订单insertOrder(userId,goodsId,num);// 2. 远程扣库存stockFeignClient.deduct(goodsId,num);// 3. 远程扣余额accountFeignClient.deduct(userId,num*100);// 模拟异常触发全局回滚inti1/0;}}2. 下游RM服务Stock、Account普通本地事务Transactional即可不用加全局注解Seata自动接管分支事务ServicepublicclassStockServiceImplimplementsStockService{TransactionalOverridepublicvoiddeduct(LonggoodsId,Integernum){// 扣减库存SQL}}六、测试效果执行下单接口代码抛出除零异常预期订单插入、库存扣减、余额扣减全部自动回滚三张表数据无变更去掉异常全部正常提交数据一致。七、关键补充要点1. AT模式原理一阶段执行业务SQL记录undo_log提交本地事务释放锁二阶段正常删除undo_log二阶段异常根据undo_log自动反向补偿回滚。2. Feign远程调用传递XID新版starter自动拦截Feign请求全局事务XID自动透传无需手动拦截器处理。3. 四种模式适用场景AT无侵入MySQL支持绝大多数微服务首选TCC侵入高自定义确认/取消接口非关系型数据库用SAGA长事务、流程编排XA数据库原生两阶段性能差极少使用。八、高频踩坑忘记给每个业务库建undo_log分支事务无法注册事务失效tx-service-group 和 Nacos 里 vgroupMapping 不匹配找不到TC本地Transactional 缺失分支事务不会上报RMTC用file存储重启后未完成事务丢失务必切换db存储多数据源场景必须手动指定数据源代理Seata才能接管。
从零搭建 Seata 服务端,手把手演示分布式事务回滚与提交
一、Seata 核心概念解决微服务跨库调用分布式事务一致性问题主流AT自动事务模式无侵入业务代码改动极小。三大角色TC 事务协调器独立服务全局事务管理者记录全局锁、事务状态、触发提交/回滚TM 事务管理器发起全局事务入口服务加注解GlobalTransactionalRM 资源管理器每个参与事务的微服务分支事务执行、上报状态、释放锁。二、Windows 部署 Seata TC可选 注册到Nacos1. 下载解压下载地址官网下载 seata-server 压缩包解压路径无中文空格示例D:\soft\seata-1.8.0。2. 修改注册配置文件 registry.confregistry { type nacos nacos { application seata-server serverAddr 127.0.0.1:8848 group DEFAULT_GROUP namespace public cluster default } } config { type nacos nacos { serverAddr 127.0.0.1:8848 group DEFAULT_GROUP namespace public } }3. 修改 store.mode存储模式file.confstore { mode db # 生产用db默认file重启事务数据丢失 db { datasource druid druid { url jdbc:mysql://127.0.0.1:3306/seata_tc?useUnicodetrue user root password 你的密码 driverClassName com.mysql.cj.jdbc.Driver } } }4. 初始化TC库表新建库seata_tc执行 seata 目录下script/server/db/mysql.sql建表。5. 启动TCcmd 进入 binseata-server.batNacos 服务列表出现seata-serverTC注册成功。三、每个参与分布式事务的业务库必须建undo_log表每个微服务自己的业务库执行下面SQLCREATETABLEundo_log(idbigintNOTNULLAUTO_INCREMENT,branch_idbigintNOTNULL,xidvarchar(128)NOTNULL,contextvarchar(128)NOTNULL,rollback_infolongblobNOTNULL,log_statusintNOTNULL,log_createddatetimeNOTNULL,log_modifieddatetimeNOTNULL,PRIMARYKEY(id),UNIQUEKEYux_undo_log(xid,branch_id))ENGINEInnoDBDEFAULTCHARSETutf8mb4;AT模式依靠undo_log生成回滚快照必须每张业务库单独建。四、微服务客户端接入1. 依赖所有参与分布式事务的微服务都引入dependencygroupIdcom.alibaba.cloud/groupIdartifactIdspring-cloud-starter-alibaba-seata/artifactId/dependency2. application.yml 统一配置spring:cloud:alibaba:seata:tx-service-group:my_tx_group# 自定义事务组名nacos:discovery:server-addr:127.0.0.1:8848额外补充在Nacos配置中心新建配置Data IDseata.propertiesservice.vgroupMapping.my_tx_groupdefaultmy_tx_group对应上面tx-service-groupdefault是TC集群名。五、AT模式代码场景举例下单服务order→ 扣库存stock→ 扣余额account任意下游抛出异常所有库同时回滚。1. 事务发起方Order服务 TM全局事务注解GlobalTransactionalServicepublicclassOrderServiceImplimplementsOrderService{AutowiredprivateStockFeignClientstockFeignClient;AutowiredprivateAccountFeignClientaccountFeignClient;OverrideGlobalTransactional(rollbackForException.class)// 开启全局事务publicvoidcreateOrder(LonguserId,LonggoodsId,Integernum){// 1. 新增订单insertOrder(userId,goodsId,num);// 2. 远程扣库存stockFeignClient.deduct(goodsId,num);// 3. 远程扣余额accountFeignClient.deduct(userId,num*100);// 模拟异常触发全局回滚inti1/0;}}2. 下游RM服务Stock、Account普通本地事务Transactional即可不用加全局注解Seata自动接管分支事务ServicepublicclassStockServiceImplimplementsStockService{TransactionalOverridepublicvoiddeduct(LonggoodsId,Integernum){// 扣减库存SQL}}六、测试效果执行下单接口代码抛出除零异常预期订单插入、库存扣减、余额扣减全部自动回滚三张表数据无变更去掉异常全部正常提交数据一致。七、关键补充要点1. AT模式原理一阶段执行业务SQL记录undo_log提交本地事务释放锁二阶段正常删除undo_log二阶段异常根据undo_log自动反向补偿回滚。2. Feign远程调用传递XID新版starter自动拦截Feign请求全局事务XID自动透传无需手动拦截器处理。3. 四种模式适用场景AT无侵入MySQL支持绝大多数微服务首选TCC侵入高自定义确认/取消接口非关系型数据库用SAGA长事务、流程编排XA数据库原生两阶段性能差极少使用。八、高频踩坑忘记给每个业务库建undo_log分支事务无法注册事务失效tx-service-group 和 Nacos 里 vgroupMapping 不匹配找不到TC本地Transactional 缺失分支事务不会上报RMTC用file存储重启后未完成事务丢失务必切换db存储多数据源场景必须手动指定数据源代理Seata才能接管。