分布式系统中,由于一个业务可能会跨多个服务实现或者跨多个数据源实现,由于传统事务是基于JDBC的Connection对象来实现事务控制的,但分布式系统通常拥有多个数据库的连接,因此无法使用传统的事务进行控制。
分布式事务是指在一个分布式系统中,多个节点上的操作需要作为一个整体来执行,确保这些操作要么全部成功,要么全部失败。但是实现比较复杂,但是我们可以使用别人提供的框架 seata,

seata针对于分布式事务具有四种解决方案:
AT 模式(Auto Commit Transaction):是一种基于两阶段提交协议的自动事务提交模式。在这种模式下,Seata 框架会自动管理事务的提交和回滚过程,以确保数据的一致性。
TCC 模式(Try-Confirm-Cancel):是一种基于补偿机制的事务处理模式。在这种模式下,事务中的每个操作都被拆分成了 try、confirm 和 cancel 三个阶段。如果所有的 try 操作都成功了, 那么事务就会被提交;否则,事务就会被回滚。
SAGA 模式(Long Running Transaction):是一种基于事件驱动的事务处理模式。在这种模式下,事务中的每个操作都是一个独立的事务,它们之间通过事件进行协调。如果一个操作失败了,那么它会发送一个补偿事件来撤销之前的操作。
XA 模式(eXtended Architecture):是一种基于 XA 协议的分布式事务处理模式。在这种模式下,事务中的每个操作都需要与事务管理器进行交互,以确保数据的一致性。
其中的AT模式的提交流程如下图:

XA模式的提交流程图如下:
image

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

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

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

在使用Seata的AT模式下实现分布式事务管理:

第一阶段:
1.在TM开启全局事务后,在执行业务时,会通知RM执行对应的sql语句,RM会同时通知TC并注册自己的分支事务。
2.RM在执行自己的sql语句前,记录快照,并在sql结束后后提交,并告知TC分支事务的状态。
第二阶段:
1.业务执行完毕,TM告知TC准备持久化数据,TCM会根据所有分支事务的状态来决定是提交还是回滚。
2.如果所有分支事务全部成功,则提交,通知RM删除undolog快照
3.如果有事务失败,则全部回滚,通知RM回复undolog快照,恢复完成后,删除undolog快照。

AT模式一阶段直接提交,不锁定资源,利用数据快照实现数据回滚,实现数据最终一致

在使用Seata的XA模式下实现分布式事务管理

第一阶段:
1.在TM开启全局事务后,在执行业务时,会通知RM执行对应的sql语句,RM会同时通知TC并注册自己的分支事务。
2.RM在执行自己的sql语句前,记录快照,并在sql结束后告知TC分支事务的状态。
第二阶段:
1.业务执行完毕,TM告知TC准备持久化数据,TCM会根据所有分支事务的状态来决定是提交还是回滚。
2.如果所有分支事务全部成功,则通知所有RM提交事务。
3.如果有事务失败,则通知所有RM回滚事务

AT 和 XA的区别

XA模式:
优点:XA模式的事务一致性强,并且满足ACID原则,且常用数据库都支持,实现简单,没有代码侵入。
缺点:因为在第一阶段需要锁定数据库资源,等待第二阶段结束才释放资源,所以性能比较差,并且依赖关系型数据库实现事务

XA模式经常用于对金额等敏感资源进行操作,例如银行业务等

AT模式:
优点:不锁定资源,且使用数据快照实现回滚,适用于几乎所有的数据库
缺点:由于时最终一致性,会产生中间数据,容易造成一些数据短暂时间不相同

AT模式使用更简单,无业务侵入,性能更好,适用于绝大多是的分布式事务