ShardingSphere与XA事务

举报
周杰伦本人 发表于 2022/11/29 17:36:32 2022/11/29
【摘要】 ShardingSphere与XA事务本篇文章源码基于4.0.1版本ShardingSphere除了支持本地事务,还支持XA事务和BASE 事务 XA事务XA事务是强一致性事务,基于两阶段提交的理论,ShardingSphere中使用Atomikos来进行两阶段提交具体流程:准备阶段:事务管理器发起提议,询问各个参与者执行阶段:根据参与者反馈的信息,全部同意进行条件事务,否则终止事务 入口...

ShardingSphere与XA事务

本篇文章源码基于4.0.1版本

ShardingSphere除了支持本地事务,还支持XA事务和BASE 事务

XA事务

XA事务是强一致性事务,基于两阶段提交的理论,ShardingSphere中使用Atomikos来进行两阶段提交

具体流程:

  1. 准备阶段:事务管理器发起提议,询问各个参与者
  2. 执行阶段:根据参与者反馈的信息,全部同意进行条件事务,否则终止事务

入口

ShardingSphere整合SpringBoot,加载数据源的时候,调用ShardingDataSourceFactory工厂类的createDataSource()方法创建数据源,方法中创建ShardingDataSource分片数据源对象,ShardingRuntimeContext分片的运行时上下文对象是它的成员变量,构造方法中创建分片上下文运行时对象,在ShardingRuntimeContext分片上下文运行时类的构造方法中又创建分布式事务管理器引擎对象ShardingTransactionManagerEngine并进行初始化,而分布式事务管理器引擎类的构造方法中调用了自身的loadShardingTransactionManager()方法

分片事务管理器引擎

ShardingTransactionManagerEngine的loadShardingTransactionManager()方法:

    public ShardingTransactionManagerEngine() {
        loadShardingTransactionManager();
    }
    
    private void loadShardingTransactionManager() {
        for (ShardingTransactionManager each : ServiceLoader.load(ShardingTransactionManager.class)) {
            if (transactionManagerMap.containsKey(each.getTransactionType())) {
                log.warn("Find more than one {} transaction manager implementation class, use `{}` now",
                    each.getTransactionType(), transactionManagerMap.get(each.getTransactionType()).getClass().getName());
                continue;
            }
            transactionManagerMap.put(each.getTransactionType(), each);
        }
    }

这个方法中使用了JDK的SPI机制,加载ShardingTransactionManager接口的实现类实例,放入map集合中

ShardingTransactionManager的实现类有XA的分片事务管理类XAShardingTransactionManager和Seata AT 分片事务管理器SeataATShardingTransactionManager

XA分片事务管理器

XA分片事务管理器XAShardingTransactionManager成员变量中有全局事务管理器XAShardingTransactionManager简称TM,XA的分片事务管理类XAShardingTransactionManager的提交或回滚操作都是调用的XA事务管理器XATransactionManager中的提交或回滚。

XATransactionManager是一个接口,它的实现类有AtomikosTransactionManager、BitronixXATransactionManager和NarayanaXATransactionManager

XATransactionManager的创建是调用的XA 事务管理器加载器XATransactionManagerLoader获取XATransactionManager实例

private final XATransactionManager xaTransactionManager = XATransactionManagerLoader.getInstance().getTransactionManager();

XATransactionManagerLoader的构造方法中是对XATransactionManager的实例化,调用了自身的load()方法

XA事务管理器的加载

XATransactionManagerLoader的load()方法:

    private XATransactionManager load() {
        Iterator<XATransactionManager> xaTransactionManagers = ServiceLoader.load(XATransactionManager.class).iterator();
        if (!xaTransactionManagers.hasNext()) {
            return new AtomikosTransactionManager();
        }
        XATransactionManager result = xaTransactionManagers.next();
        if (xaTransactionManagers.hasNext()) {
            log.warn("There are more than one transaction mangers existing, chosen first one by default.");
        }
        return result;
    }

这个一看,也是用的JDK的SPI机制来加载实例,如果没有配置XATransactionManager的实现类,就默认创建AtomikosTransactionManager对象。如果配置了多个默认使用第一个事务管理器

总结

这篇文章我们主要讲了ShardingSphere与XA事务的整合的源码,以ShardingSphere与SpringBoot相结合加载数据源的时候,一步步从分片数据源工厂类到分配运行时上下文再到分片事务管理器引擎再到分片事务管理,最后到XA事务管理器的创建过程,ShardingSphere默认采用AtomikosTransactionManager

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。