Seata分布式事务解决方案

分布式有可能会带来很多额外的技术问题,如分布式事务,分布式锁,全局唯一ID等问题,假如从设计层面可以避免这些问题,建议还是从设计层面避免。

 

安装:

首先下载https://github.com/seata/seata/releases/ 1.4.2的版本,修改file.conf和registry.conf

 

 下载源码https://gitee.com/jovic/seata, 建立seata数据库,执行script/server/db/mysql.sql

启动Eureka,然后启动\seata\seata-server-1.4.2\bin\seata-server.bat

 

Seata有3个基本组成部分

A. 事务协调器(TC-Transaction Coordinator):维护全局事务和分支事务的状态,驱动全局提交或回滚。

B. 事务管理器(TM-Transaction Manager): 定义全局事务的范围, 开始全局事务,提交或回滚全局事务。

C.资源管理器(RM-Resource Manager):管理正在处理的分支事务的资源,与TC对话以注册分支事务并报告分支事务的状态,并驱动分支事务的提交或回滚。

 

 

Seata管理的分布式事务的典型生命周期

  1. TM要求TC开始一项新的全局事务。TC生成代表全局事务的XID。

  2. XID通过微服务的调用链传播。

  3. RM将本地事务注册为XID到TC的相应全局事务的分支。

  4. TM要求TC提交或回退相应的XID全局事务。

  5. TC驱动XID的相应全局事务下的所有分支事务以完成分支提交或回滚

 

 

案例

下面看看下单->扣库存->扣账户余额这个流程,怎么解决分布式事务的问题,图示如下:

 

 

 

 

测试失败的Case, UserId 为1002 的用户下单,account-service会抛出异常导致事务回滚

http://127.0.0.1:8084/api/business/purchase/rollback

seata-server1.4.2的log可以看到事务回滚成功

 

 

测试成功的Case,UserId 为1001的用户下单,事务成功提交:

http://127.0.0.1:8084/api/business/purchase/commit

 

关注公众号“一米源码”回复“Seata”获取项目示例源码

posted on 2021-06-14 16:30  itproject-manager  阅读(173)  评论(0编辑  收藏  举报