
微服务架构下一个业务操作可能跨多个数据库。分布式事务保证多个服务之间的数据一致性。一、什么场景需要分布式事务下单场景涉及多个服务 订单服务 → order_db创建订单 库存服务 → stock_db扣减库存 积分服务 → point_db增加积分 任一服务失败其他服务必须回滚二、Seata AT 模式原理全局事务GlobalTransaction ├── 分支事务1订单服务 ├── 分支事务2库存服务 └── 分支事务3积分服务 执行流程 1. 每个分支事务先写 undo log 2. 执行 SQL 修改数据 3. 全部成功 → 提交删除 undo log 4. 任一失败 → 根据 undo log 回滚三、Seata Server 部署# 下载 seata-serverdockerrun--nameseata-server-d\-p8091:8091\-eSEATA_IP192.168.1.100\seataio/seata-server:1.6.1建表seata.sql-- undo_log 表每个业务库都要建CREATETABLEundo_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;四、SpringBoot 集成seata:enabled:trueapplication-id:seckill-ordertx-service-group:seckill_tx_groupservice:vgroup-mapping:seckill_tx_group:defaultgrouplist:default:127.0.0.1:8091dependencygroupIdcom.alibaba.cloud/groupIdartifactIdspring-cloud-starter-alibaba-seata/artifactId/dependency五、使用 GlobalTransactionalServicepublicclassOrderService{AutowiredprivateOrderMapperorderMapper;AutowiredprivateStockClientstockClient;AutowiredprivatePointClientpointClient;/** * 分布式事务创建订单 扣库存 加积分 * 任一失败全部回滚 */GlobalTransactional(namecreate-order,rollbackForException.class)publicOrdercreateOrder(OrderDTOdto){// 1. 创建订单OrderordernewOrder();order.setUserId(dto.getUserId());order.setProductId(dto.getProductId());order.setAmount(dto.getAmount());orderMapper.insert(order);// 2. 扣减库存远程调用库存服务ResultVO?stockResultstockClient.deduct(dto.getProductId(),1);if(stockResult.getCode()!200){thrownewBusinessException(400,库存不足);}// 3. 增加积分远程调用积分服务ResultVO?pointResultpointClient.addPoints(dto.getUserId(),100);if(pointResult.getCode()!200){thrownewBusinessException(400,积分增加失败);}returnorder;}}六、AT 模式的限制1. 仅支持 InnoDB 引擎 2. 业务表必须有主键 3. undo_log 表必须在每个业务库中 4. 不适合长事务全局锁持有时间过长七、AT vs TCC 模式模式性能侵入性适用场景AT⭐⭐⭐⭐低注解即可大多数场景TCC⭐⭐⭐高需写3个方法高性能要求 觉得有用的话点赞 关注【张老师技术栈】吧每周更新 Java/Python/MySQL 实战干货不让你白来。