硬核!2w 字长文爆肝分布式事务知识点!! (5)

3.通知事务组:是指在发起方执行完业务代码以后,将发起方执行结果状态通知给 TxManager,TxManager 将根据事务最终状态和事务组的信息来通知相应的参与模块提交或回滚事务,并返回结果给事务发起方。

2.7Seata 事务 2.7.1背景

Seata(Simple Extensible Autonomous Transaction Architecture) 是 阿里巴巴开源的分布式事务中间件,以高效并且对业务 0 侵入的方式,解决微服务场景下面临的分布式事务问题。

2.7.2设计思想

seata 的 AT 模式,采用的是大量运用在数据库软件的 Write Ahead Log 思想,即把事务的信息以事务日志的方式记录下来。这种处理方式,实际上是对传统两阶段提交的一种改进和优化。主要有几个关键点

传统两阶段提交协议是阻塞协议,性能差

传统两阶段提交协议高可用性不好

传统两阶段提交协议的全局事务隔离机制不支持

根据八二原则,80% 的涉及到全局事务的业务是能正常完成并提交的。

因此,在 AT 模式下,seata 采取的做法是,一个事务分支的数据库操作执行完后,马上进行本地事务的提交,从而释放相关的数据库资源

在这里插入图片描述

分支事务中数据的 本地锁 由本地事务管理,在分支事务 Phase1 结束时释放。

同时,随着本地事务结束,连接 也得以释放。

分支事务中数据的 全局锁 在事务协调器侧管理,在决议 Phase2 全局提交时,全局锁马上可以释放。只有在决议全局回滚的情况下,全局锁 才被持有至分支的 Phase2 结束。

2.7.3 本地事务执行流程

在进行本地提交的前提是,seata 会解析 SQL,获取数据库表的元数据,根绝 SQL 类型,选择性地生成数据的前置镜像和后置镜像, 保存在 undolog 表中,并且要求与保存 undolog 与业务 SQL 在同一个本地事务内。

这就保证了

如果一个本地事务被提交,那么必定对应着相应的 undo_log

如果保存 undo_log 保存失败,那么业务 SQL 也会失败

在这里插入图片描述

2.7.4全局事务提交流程

因为每个分支事务的本地事务都已经被提交,所以如果全局事务能够顺利进行到“提交“这一阶段,那么意味着所有事务分支的本地事务都已经被提交了,数据的一致性已经得到了保证

这个时候全局事务的提交就变得十分轻量级,就是把 undo_log 对应的记录删掉即可,即使是当时删除失败了,也已经不会影响全局事务的最终结果,这次删不了,那就待会再删,程序删不了,没事,顶多人工删。

在这里插入图片描述

2.7.5全局事务回滚流程

如果全局事务的任何一个事务分支失败了,那么全局事务就进入“回滚“流程,回滚时依据先前保存好数据镜像,将原来的数据回放回去

最后

java高级开发系统进阶笔记、最新面试复习笔记PDF,我的GitHub

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zyxwzf.html