什么是分布式事务?
简单来说:在分布式系统中出现的事务问题,称为分布式事务。
为什么会出现分布式事务:
一个分布式事务流程图
在这个业务中有3个数据库连接,就没有办法做到全局的事务控制。这就是分布式事务问题
分布式事务产生的情况有两种:
1. 业务跨多个服务实现
2. 业务跨多个数据源实现
可以使用Seata解决分布式事务问题:
-
分布式事务问题的方案有以下几种
AT 模式:这是一种自动化的两阶段提交协议的变种。在该模式下,Seata 能够自动地将业务操作转换为符合 两阶段提交协议的操作。在业务提交之前,会将业务数据修改的快照保存到 Seata 的存储中。如果全局事务协调器决定提交,则应用变更;如果决定回滚,则根据快照恢复原状。
XA 模式:XA 协议是一种传统的两阶段提交协议,它要求资源管理器(如数据库)支持 XA 接口。然而,Seata 主要关注的是非 XA 资源的分布式事务管理,因此对于支持 XA 协议的资源,通常直接使用标准的 XA 事务处理机制,而不是通过 Seata 处理。
TCC 模式:
Saga 模式:
Seata的AT模式的执行流程:
AT模式流程图:
- TC (Transaction Coordinator) - 事务协调者:维护全局和分支事务的状态,协调全局事务提交或回滚。
- TM (Transaction Manager) - 事务管理器:定义全局事务的范围、开始全局事务、提交或回滚全局事务。
- RM (Resource Manager) - 资源管理器:管理分支事务,与TC交谈以注册分支事务和报告分支事务的状态,并驱动分支事务提交或回滚。
流程说明:
一阶段:
1 TC架设
1.1 TM通知TC开启全局事务
1.2 TM调用分支事务
分支事务发生的变化:
1.3 注册分支事务到TC
1.4 执行完成sql之后并提交,在sql提交前后会把数据记录到一个快照表中,这个表就是undo_log表。
这个时候数据库中的数据就是已经更新过的了
1.5 分支事务报告事务的状态
二阶段:
2.1 TM通知TC 提交或回滚全局事务
2.2 TC检查分支事务的状态
2.3 分支事务成功:
2.4 提交,删除undo_log表中的记录
2.3 分支事务失败:
2.4 回滚,根据undo-log恢复数据到更新之前,并删除undo_log表中的记录
注意:
-
如果有多分支事务,某个分支事务执行成功,提交后的数据,就是一个中间状态
-
AT模式是最终一致性的解决方案,所有会有中间状态不一致的情况
优点:
-
AT模式使用起来更加简单,无业务侵入,性能更好。
-
因此企业90%的分布式事务都可以用AT模式来解决。