一、什么是分布式事务
首先要明白传统事务与分布式事务的区别
1.1 传统事务
常用的注解@Transaction即为传统事务的实现形式,其可以保证在一次数据库的连接中,当某一SQL出现异常而失败时,使其之前执行成功的SQL回滚以保证数据库事务的一致性
1.2 分布式事务
分布式环境下,多个微服务之间会存在业务交互,即同一业务场景下操作了多个数据库,此时会创建多个数据库链接,传统事务就无法再此场景下保证事务一致性。
分布式事务则是将多个单个传统事务整合为一个大的事务进行管理,数据执行成功,标记一个状态,当每一个传统事务都成功执行,则通知系统删除undo_log的记录,持久化数据;若有某一传统事务失败,则通知系统依据undo_log保存的数据将每一个操作都回滚,以保证分布式环境下数据的一致性。
二、Neata实现分布式事务的四种模式
2.1 XA模式
XA规范 是X/Open组织定义的分布式事务处理(DTP,Distributed Transaction Processing)标准,XA 规范 描述了全局的TM与局部的RM之间的接口,几乎所有主流的数据库都对 XA 规范 提供了支持。
目前主流数据库都实现了这种规范,实现的原理都是基于两阶段提交。
XA模式是强一致性模式,在该模式下数据始终要求保持一致性,它既追求结果一致性,也追求过程一致性,一般应用在银行系统中,以确保精准的数据一致。
原始的XA模型
Seata对原始XA模型做了封装,以便更好的适应自己的事务模型
2.2 TCC模式
TCC模式是基于补偿机制实现的分布式事务,也是一种最终一致性的两阶段提交协议,需要程序员自己实现业务的Try、Confirm和Cancel三个操作,灵活度更高,但是对代码有侵入性。
2.3 AT模式(默认)
AT模式是一种弱一致性模型,他只追求结果的一致性,而对于过程中的数据一致性并不关心,虽然这有可能导致数据出现问题,但在对数据要求并不是那么严格的场景下,这种模式的高性能更受欢迎,同样的这个模式也是Seata的默认事务模式。
下方附AT模式详解
2.4 SATA模式
SATA是一种长事务模式,他将一个事务拆分为一个个的子事务来执行,每个子事务都可以独立地提交或回滚,从而避免长时间占用资源,在每一个子事务中都包含正向操作和反向操作,当事务全部正常结束,删除日志文件并结束业务,若有子事务失败,则基于日志文件执行已执行子事务的反向操作将数据还原并删除日志文件。
三、Neata的AT模式详解
3.1 模型图
黑色路径:第一阶段执行逻辑
天蓝色路径:第二阶段执行逻辑
3.2 流程梳理
第一阶段:
- Seata向TC报告开启事务,获取业务的SQL语句
- Seata申请事务ID,确保事务唯一性
- 调用子事务一执行SQL并提交
- 向TC报告该事务执行状态
第二阶段:
- Seata报告TC所有子事务执行完成
- TC检查所有子事务的执行结果
- 若成功,删除undo_log旧数据,数据最终落盘
- 若失败,将每一个子事务数据回滚至事务执行前状态
3.3 优缺点分析
3.3.1 优点
- 可以保证数据的最终一致性
- 在保证最终一致性的前提下比之XA模式有性能上的优势
- 无代码侵入性
3.3.2
- 需要记录数据的前后镜像,增加了数据库的存储和网络的传输开销。
- 需要在第一阶段获取全局锁,防止脏写,影响并发性能。
- 需要在第二阶段根据镜像生成反向SQL语句,可能存在SQL解析和执行的不准确性。
四、项目整合Seata
// 待完成