一ID+三组件模型
Transaction ID XID 全局唯一的事务ID
Transaction Coordinator(TC) 事务协调器,维护全局事务的运行状态,负责协调并驱动全局事务的提交或回滚
Transaction Manager™ 控制全局事务的边界,负责开启一个全局事务,并最终发起全局提交或全局回滚的决议
Resource Manager(RM) 控制分支事务,负责分支注册、状态汇报,并接受事务协调器的指令,驱动分支(本地)事务的提交和回滚
- TM向TC申请开启一个全局事务,全局事务创建成功并生成一个全局唯一的XID
- XID在微服务调用链路的上下文中传播
- RM向TC注册分支事务,将其纳入XID对应全局事务的管辖
- TM向TC发起针对XID的全局提交或回滚决议
- TC调度XID下管辖的全部分支事务完成提交或回滚请求
=====================================================================
一、下载seata-server-xxx.zip并解压到指定目录,修改conf目录下的file.conf配置文件
主要修改内容:自定义事务组名称 + 事务日志存储模式为db + 数据库连接信息
二、创建数据库seata以及表(seata/conf目录下的db_store.sql文件)
三、修改registry.conf配置文件
四、启动nacos,在启动seata-server
=======================================
业务中使用
三个微服务:一个订单服务,一个库存服务,一个账户服务
- 当用户下单时,会在订单服务中创建一个订单,然后通过远程调用库存服务来扣减下单商品的库存
- 通过远程调用账户服务来扣减用户账号里面的余额
- 最后在订单服务中修改订单状态,完成流程
最终结果如下:
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-seata</artifactId>
<exclusions>
<exclusion>
<artifactId>seata-all</artifactId>
<groupId>io.seata</groupId>
</exclusion>
</exclusions>
</dependency>
<!--该版本最好和下载的seata版本一致-->
<dependency>
<groupId>io.seata</groupId>
<artifactId>seata-all</artifactId>
<version>0.9.0</version>
</dependency>
如果超时异常,AccountServiceImpl中的desrease方法中出现TimeUnit.SECONDS.sleep(20)
检查数据库出现错误,订单未完成,但库存和账户金额都减少
在OrderServiceImpl方法create上添加注解@GlobalTransactional
@GlobalTransactional(name = "fsp-create-order",rollback = Exception.class)