分布式事务(五):Seata之XA事务模式原理

1、XA事务模式概述

  XA事务模式是在 Seata 定义的分布式事务框架内,利用事务资源(数据库、消息服务等)对 XA 协议的支持,以 XA 协议的机制来管理分支事务的一种 事务模式。

 0

1.1、执行阶段

  可回滚:业务 SQL 操作放在 XA 分支中进行,由资源对 XA 协议的支持来保证 可回滚

  持久化:XA 分支完成后,执行 XA prepare,同样,由资源对 XA 协议的支持来保证 持久化(即,之后任何意外都不会造成无法回滚的情况)

1.2、完成阶段

  分支提交:执行 XA 分支的 commit

  分支回滚:执行 XA 分支的 rollback

2、XA事务模式工作机制

2.1、整体运行机制

  XA模式运行在Seata定义的事务框架内:

 

2.1.1、执行阶段(E xecute)

  XA start/XA end/XA prepare + SQL + 注册分支

2.1.2、完成阶段(Finish)

  XA commit/XA rollback

2.2、数据源代理

  XA 模式需要 XAConnection。

2.2.1、获取XAConnection的两种方式

获取 XAConnection 有两种方式:

  方式一:要求开发者配置 XADataSource,会增加开发负担,需要为 XA 模式专门去学习和使用 XA 数据源,与 透明化 XA 编程模型的设计目标相违背,不建议。

  方式二:根据开发者的普通 DataSource 来创建,和 AT 模式使用一样,开发者完全不必关心 XA 层面的任何问题,保持本地编程模型即可。

  数据源代理根据普通数据源中获取的普通 JDBC 连接创建出相应的 XAConnection。

1.1、方式二与AT模型的类比

类比 AT 模式的数据源代理机制,如下:

 0

1.2、方式一与AT模型的类比

  方式二是在做数据库驱动程序要做的事情。不同的厂商、不同版本的数据库驱动实现机制是厂商私有的,我们只能保证在充分测试过的驱动程序上是正确的,开发者使用的驱动程序版本差异很可能造成机制的失效。

  方式二无法保证兼容的正确性,所以,XA 模式的数据源代理设计需要同时支持第一种方式:基于 XA 数据源进行代理。

  类比 AT 模式的数据源代理机制,如下:

 0

3、分支注册

  XA start 需要 Xid 参数,这个 Xid 需要和 Seata 全局事务的 XID 和 BranchId 关联起来,以便由 TC 驱动 XA 分支的提交或回滚。

  Seata2.x 的 BranchId 是在分支注册过程,由 TC 统一生成的,所以 XA 模式分支注册的时机需要在 XA start 之前。

优化方向:

  把分支注册尽量延后。类似 AT 模式在本地事务提交之前才注册分支,避免分支执行失败情况下,没有意义的分支注册。

  这个优化方向需要 BranchId 生成机制的变化来配合。BranchId 不通过分支注册过程生成,而是生成后再带着 BranchId 去注册分支。

 

posted @ 2024-02-07 16:57  无虑的小猪  阅读(98)  评论(0编辑  收藏  举报