文章目录
Seata
文章目录 |
---|
GitHub - seata/seata: Seata is an easy-to-use, high-performance, open source distributed transaction solution. |
GitHub - seata/seata-samples: seata-samples |
完美起航-Seata集成实战 (okgoes.cn) |
一、分布式事务介绍
什么是事务(Transaction)?
一般是指要做的或所做的事情,包含开始和结束,并且在计算机中含有“回滚”的概念:当一组事务的执行中发生无法预估的错误,将会把之前执行完成的动作进行恢复
1.1 事务的四种属性:ACID
-
原子性
一个事务是一个不可分割的工作单位,事务中包括的操作要么都做,要么都不做。
-
一致性
也叫原子性,事务必须是使数据库从一个一致性状态变到另一个一致性状态。
-
隔离性
并发执行的各个事务之间不能互相干扰。
-
持久性
一个事务一旦提交,它对数据库中数据的改变就应该是永久性的
1.2 本地事务 or 分布式事务
-
本地事务
也叫传统事务/数据库事务,只应用到单节点单服务操作
-
分布式事务
多节点多服务之间的事务,在各个微服务之间执行事务,这些微服务要么都成功,要么都回滚
1.3 CAP定理
CAP 定理,又被叫作布鲁尔定理
-
C (一致性)
数据在多个副本之间能够保持一致的特性。
-
强一致性
对于关系型数据库,要求更新过的数据能被后续的访问都能看到。
-
弱一致性
数据更新后,能容忍后续的访问只能访问到部分或者全部访问不到。
-
-
A (可用性)
指系统提供的服务必须一直处于可用的状态,每次只要收到用户的请求,服务器就必须给出回应(不是错误和超时的响应)。
-
P (网络分区容错性)
网络节点之间无法通信的情况下,节点被隔离,产生了网络分区, 整个系统仍然是可以工作的。
CAP原则的精髓就是要么AP,要么CP,要么AC,但是不存在CAP
1.4 分布式事务的解决方案
基于XA协议的两阶段提交(2PC
)
-
概念
分为两个部分,事务管理器和本地资源管理器
本地资源管理器:由数据库实现XA接口
事务管理器:作为全局的调度者,负责各个本地资源的提交和回滚
-
交互流程
分为两个阶段,投票阶段和提交阶段
投票阶段:参与者将自身操作结果反馈给协调者(全局事务管理器)
提交阶段:协调者根据反馈上来的结果,决定各个参与者要全部提交还是全部回滚
-
缺点:算法执行过程中,所有节点进入阻塞状态,效率低
代码补偿事务(TCC
)
-
交互流程
分为两个步骤,预留资源和资源操作
阶段1(Try):做业务资源预留,进行业务的一致性检查,查看所有服务是否可以执行该操作
阶段2(Confirm):确认执行业务操作,不做任何业务检查, 只使用Try阶段预留的业务资源
阶段3(Cancel):取消Try阶段预留的业务资源
-
缺点:侵入性
1.5 XA与TCC的区别
XA | TCC | |
---|---|---|
一致性 | 资源层面的分布式事务,强一致性 | 业务层面的分布式事务,弱一致性(最终一致性) |
侵入性 | 无侵入性 | 侵入性强 |
依赖支持 | 需要数据源支持XA接口 | 无 |
二、Seata的介绍和使用
介绍
Seata是阿里巴巴开源的一个分布式事务框架,能够让大家在操作分布式事务时,像操作本地事务一样简单,一个注解搞定分布式事务。
ta有两种分布式事务的实现方案
- AT:使得应用代码可以像使用本地事务一样使用分布式事务,完全屏蔽了底层细节
- TCC
接下来聊聊这两种方案,首先图解AT模式
- 业务通过 JDBC 标准接口访问数据库资源时,Seata 框架会对所有请求进行拦截
- 每个本地事务提交时,本地资源管理器(Resource Manager)会向TC事务协调器注册分支事务
- 请求链路调用完成,进入第二阶段,决定是否提交还是回滚
接下来看看这三种组件的功能点
-
Transaction Coordinator (TC)
事务协调器,维护全局事务的运行状态,负责协调并决定全局事务的提交或回滚
-
Transaction Manager(TM)
控制全局事务的边界,负责开启一个全局事务,并最终发起全局提交或全局回滚的决议
-
Resource Manager (RM)
资源管理器,负责本地事务的注册,本地事务状态的汇报(投票),并且负责本地事务的提交和回滚
其中,XID是一个全局事务的唯一标识。
使用
做之前,思路梳理清楚,每个服务都是一个RM
资源管理器;另外有一个单独的TM
服务,专门进行全局各个服务的调用;最后TC
事务协调器,其实我们单独开启的Seata服务就是一个事务协调器。
我们将使用的流程梳理一下
-
前期准备
-
下载Seata服务代码至本地项目;
-
创建单独的数据库,记录分支信息;
-
每个业务数据库中创建undo_log表,记录回滚操作;
-
-
修改Seata服务的registry.conf配置文件
- 连接注册中心
- 连接Seata数据库
-
所有涉及分布式事务的项目(包括Seata服务本身),全部引入alibaba-seata的pom依赖
-
修改项目的配置文件,加入Seata独有的一些配置,例如是否使用分布式事物等
#是否使用分布式事物 seata: enabled: true application-id: seata-bus
-
在业务层上,对某个调用了多服务的数据库操作方法打上注解开启分布式事务
@GlobalTransactional public Boolean RunDemo(){ // 服务A调用 // ..... // 服务B调用 // ..... // 服务C调用 // ..... return true; }
-
进行测试,查看效果
-
我贴个依赖放在这给自己看
<!-- https://mvnrepository.com/artifact/com.alibaba.cloud/spring-cloud-alibaba-seata --> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-alibaba-seata</artifactId> <version>2.2.0.RELEASE</version> </dependency>
关于具体的使用在文章开头目录有一个链接,那个博主写的挺好,实际工作上要照抄的话可以去那里看,我这里只是给自己入门看的