#JAVA破局之路#分布式事务解决方案),分布式事务详解(mysql事务如何实现的( 六 )


2.7.2设计思想seata的AT模式 , 采用的是大量运用在数据库软件的WriteAheadLog思想 , 即把事务的信息以事务日志的方式记录下来 。
这种处理方式 , 实际上是对传统两阶段提交的一种改进和优化 。 主要有几个关键点:
1.传统两阶段提交协议是阻塞协议 , 性能差
2.传统两阶段提交协议高可用性不好
3.传统两阶段提交协议的全局事务隔离机制不支持
4.根据八二原则 , 80%的涉及到全局事务的业务是能正常完成并提交的 。
因此 , 在AT模式下 , seata采取的做法是 , 一个事务分支的数据库操作执行完后 , 马上进行本地事务的提交 , 从而释放相关的数据库资源 。
#JAVA破局之路#分布式事务解决方案),分布式事务详解(mysql事务如何实现的
文章图片
·分支事务中数据的本地锁由本地事务管理 , 在分支事务Phase1结束时释放 。
·同时 , 随着本地事务结束 , 连接也得以释放 。
·分支事务中数据的锁全局锁在事务协调器侧管理 , 在决议Phase2全局提交时 , 全局锁马上可以释放 。 只有在决议全局回滚的情况下 , 锁全局锁才被持有至分支的Phase2结束 。
2.7.3本地事务执行流程在进行本地提交的前提是 , seata会解析SQL , 获取数据库表的元数据 , 根绝SQL类型 , 选择性地生成数据的前置镜像和后置镜像 , 保存在undo_log表中 , 并且要求与保存undo_log与业务SQL在同一个本地事务内 。
这就保证了:
1.如果一个本地事务被提交 , 那么必定对应着相应的undo_log
2.如果保存undo_log保存失败 , 那么业务SQL也会失败
#JAVA破局之路#分布式事务解决方案),分布式事务详解(mysql事务如何实现的
文章图片
2.7.4全局事务提交流程因为每个分支事务的本地事务都已经被提交 , 所以如果全局事务能够顺利进行到“提交“这一阶段 , 那么意味着所有事务分支的本地事务都已经被提交了 , 数据的一致性已经得到了保证 。
这个时候全局事务的提交就变得十分轻量级 , 就是把undo_log对应的记录删掉即可 , 即使是当时删除失败了 , 也已经不会影响全局事务的最终结果 , 这次删不了 , 那就待会再删 , 程序删不了 , 没事 , 顶多人工删 。
#JAVA破局之路#分布式事务解决方案),分布式事务详解(mysql事务如何实现的
文章图片
2.7.5全局事务回滚流程如果全局事务的任何一个事务分支失败了 , 那么全局事务就进入“回滚“流程 , 回滚时依据先前保存好数据镜像 , 将原来的数据回放回去 。
如果全局回放成功 , 那么数据的一致性也就得到了保证 , 如果回放不成功 , 那么事务就进入异常 。 应对异常 , 可能需要重试 , 也可能需要人工介入 。
#JAVA破局之路#分布式事务解决方案),分布式事务详解(mysql事务如何实现的
文章图片
【谢谢你的关注】