ShardingSphere与XA事务
本篇文章源码基于4.0.1版本
ShardingSphere除了支持本地事务,还支持XA事务和BASE 事务
XA事务
XA事务是强一致型事务,基于两阶段提交的理论,ShardingSphere中使用Atomikos来进行两阶段提交
具体流程:
- 准备阶段:事务管理器发起提议,询问各个参与者
- 执行阶段:根据参与者反馈的信息,全部同意进行条件事务,否则终止事务
入口
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;
}
总结
❤️ 感谢大家
- 欢迎关注我❤️,点赞👍🏻,评论🤤,转发🙏
- 有不当之处欢迎批评指正。