SpringCloud-Alibaba之Seata处理分布式事务

一ID+三组件模型

Transaction ID XID 全局唯一的事务ID

Transaction Coordinator(TC) 事务协调器,维护全局事务的运行状态,负责协调并驱动全局事务的提交或回滚
Transaction Manager™ 控制全局事务的边界,负责开启一个全局事务,并最终发起全局提交或全局回滚的决议
Resource Manager(RM) 控制分支事务,负责分支注册、状态汇报,并接受事务协调器的指令,驱动分支(本地)事务的提交和回滚

  1. TM向TC申请开启一个全局事务,全局事务创建成功并生成一个全局唯一的XID
  2. XID在微服务调用链路的上下文中传播
  3. RM向TC注册分支事务,将其纳入XID对应全局事务的管辖
  4. TM向TC发起针对XID的全局提交或回滚决议
  5. TC调度XID下管辖的全部分支事务完成提交或回滚请求
    SpringCloud-Alibaba之Seata处理分布式事务_第1张图片

=====================================================================

一、下载seata-server-xxx.zip并解压到指定目录,修改conf目录下的file.conf配置文件

主要修改内容:自定义事务组名称 + 事务日志存储模式为db + 数据库连接信息
SpringCloud-Alibaba之Seata处理分布式事务_第2张图片

SpringCloud-Alibaba之Seata处理分布式事务_第3张图片
SpringCloud-Alibaba之Seata处理分布式事务_第4张图片

二、创建数据库seata以及表(seata/conf目录下的db_store.sql文件)

三、修改registry.conf配置文件
SpringCloud-Alibaba之Seata处理分布式事务_第5张图片
四、启动nacos,在启动seata-server

=======================================

业务中使用

三个微服务:一个订单服务,一个库存服务,一个账户服务

  1. 当用户下单时,会在订单服务中创建一个订单,然后通过远程调用库存服务来扣减下单商品的库存
  2. 通过远程调用账户服务来扣减用户账号里面的余额
  3. 最后在订单服务中修改订单状态,完成流程

SpringCloud-Alibaba之Seata处理分布式事务_第6张图片
SpringCloud-Alibaba之Seata处理分布式事务_第7张图片
SpringCloud-Alibaba之Seata处理分布式事务_第8张图片

最终结果如下:
SpringCloud-Alibaba之Seata处理分布式事务_第9张图片

<dependency>
	<groupId>com.alibaba.cloudgroupId>
	<artifactId>spring-cloud-starter-alibaba-seataartifactId>
	<exclusions>
		<exclusion>
			<artifactId>seata-allartifactId>
			<groupId>io.seatagroupId>
		exclusion>
	exclusions>
dependency>

<dependency>
	<groupId>io.seatagroupId>
	<artifactId>seata-allartifactId>
	<version>0.9.0version>
dependency>

SpringCloud-Alibaba之Seata处理分布式事务_第10张图片
SpringCloud-Alibaba之Seata处理分布式事务_第11张图片

如果超时异常,AccountServiceImpl中的desrease方法中出现TimeUnit.SECONDS.sleep(20)

检查数据库出现错误,订单未完成,但库存和账户金额都减少

在OrderServiceImpl方法create上添加注解@GlobalTransactional

@GlobalTransactional(name = "fsp-create-order",rollback = Exception.class)

你可能感兴趣的:(spring,cloud,分布式,数据库)