事务(Transaction)是一种机制、一个操作序列,包含了一组数据库操作命令。事务把所有的命令作为一个整体一起向系统提交或撤销操作请求,即这一组数据库命令要么都执行,要么都不执行,因此事务是一个不可分割的工作逻辑单元。
分布式系统会把一个应用系统拆分为可独立部署的多个服务,因此需要服务与服务之间远程协作才能完成事务操作,这种分布式系统环境下由不同的服务之间通过网络远程协作完成事务称之为分布式事务,例如用户注册送积分事务、创建订单减库存事务,银行转账事务等都是分布式事务。
我们知道本地事务依赖数据库本身提供的事务特性来实现,因此以下逻辑可以控制本地事务:
- begin transaction;
- //1.本地数据库操作:张三减少金额
- //2.本地数据库操作:李四增加金额
- commit transation;
但是在分布式环境下,会变成下边这样:
- begin transaction;
- //1.本地数据库操作:张三减少金额
- //2.本地数据库操作:李四增加金额
- commit transation;
可以设想,当远程调用让李四增加金额成功了,由于网络问题远程调用并没有返回,此时本地事务提交失败就回滚了张三减少金额的操作,此时张三和李四的数据就不一致了。
因此在分布式架构的基础上,传统数据库事务就无法使用了,张三和李四的账户不在一个数据库中甚至不在一个应用系统里,实现转账事务需要通过远程调用,由于网络问题就会导致分布式事务问题。
Seata 是一款开源的分布式事务解决方案,致力于提供高性能和简单易用的分布式事务服务。Seata 将为用户提供了 AT、TCC、SAGA 和 XA 事务模式,为用户打造一站式的分布式解决方案。
Seata的执行流程如下:
A服务【订单微服务】的TM[事务发起者]向TC[seata服务端]申请开启一个全局事务,TC就会创建一个全局事务并返回一个唯一的XID
A服务开始远程调用B服务【账户微服务】,此时XID会在微服务的调用链上传播
B服务的RM向TC注册分支事务,并将其纳入XID对应的全局事务的管辖
B服务执行分支事务,向数据库做操作
全局事务调用链处理完毕,TM根据有无异常向TC发起全局事务的提交或者回滚
TC协调其管辖之下的所有分支事务, 决定是否回滚
TM:事务发起者【在哪个方法上添加了全局事务注解的】
TC : 事务管理器【seata的服务端】
RM: 每个操作数据库的微服务
XID: 全局事务id
TM和RM都属于微服务代码
TC: seata服务器。
注意:这里的下载版本不是乱选的,要和自己的spring cloud版本对应
下载完毕直接解压,无需安装
注意:文件解压位置不可以有中文,否则会导致后边启动失败
注意:文件解压位置不可以有中文,否则会导致后边启动失败
注意:文件解压位置不可以有中文,否则会导致后边启动失败
如果是单机版,到这里已经可以 启动了,
如果是集群版,那还需要下载一个资源包。
解压后的资源包
这里使用集群版,不使用单机版
让seata集群信息可以共享,我们应该修改它的保存位置:
数据表虽然我们也要创建,但是他已经准备好所需的sql文件了,我们只需执行
然后引入mysql依赖jar包
定义注册中心参数
定义配置中心参数
我们看看官方给的解释
Seata 事务分组https://seata.io/zh-cn/docs/user/txgroup/transaction-group.html
准备几个数据库,这里用三个,数据库自己建,随意
在每个数据库中创建unlog表,注意这个表就不是自己建的了
seata 一定要保证和seata服务的版本匹配
seata 一定要保证和seata服务的版本匹配
seata 一定要保证和seata服务的版本匹配
-
- <dependency>
- <groupId>com.alibaba.cloudgroupId>
- <artifactId>spring-cloud-starter-alibaba-seataartifactId>
- dependency>
此注解开启分布式事务