Shardingsphere整合Atomikos对XA分布式事务的支持(1)

2020 年 11 月 23 日

Shardingsphere整合Atomikos对XA分布式事务的支持(1)

Apache ShardingSphere 是一套开源的分布式数据库中间件解决方案组成的生态圈,它由 JDBC、Proxy 和 Sidecar(规划中)这 3 款相互独立,却又能够混合部署配合使用的产品组成。它们均提供标准化的数据分片、分布式事务和数据库治理功能,可适用于如 Java 同构、异构语言、云原生等各种多样化的应用场景。


ShardingSphere 已于 2020 年 4 月 16 日成为 Apache 软件基金会的顶级项目。


分布式系统 CAP 理论



一致性(Consistency)


  • 一致性指 all nodes see the same data at the same time,即更新操作成功并返回客户端完成后,所有节点在同一时间的数据完全一致,不能存在中间状态。

  • 关于一致性,如果用户时刻看到的数据都是一致的,那么称之为强一致性。如果允许存在中间状态,只要求经过一段时间后,数据最终是一致的,则称之为最终一致性。此外,如果允许存在部分数据不一致,那么就称之为弱一致性


可用性(Availability)


  • 可用性是指系统提供的服务必须一直处于可用的状态,对于用户的每一个操作请求总是能够在有限的时间内返回结果。有限的时间内是指:对于用户的一个操作请求,系统必须能够在指定的时间内返回对应的处理结果,如果超过了这个时间范围,那么系统就被认为是不可用的。

  • 返回结果是可用性的另一个非常重要的指标,它要求系统在完成对用户请求的处理后,返回一个正常的响应结果,不论这个结果是成功还是失败。


分区容错性(Partition tolerance )


  • 布式系统在遇到任何网络分区故障的时候,仍然需要能够保证对外提供满足一致性和可用性的服务,除非是整个网络环境都发生了故障。


X/Open DTP 模型与 XA 规范


X/Open,即现在的 open group,是一个独立的组织,主要负责制定各种行业技术标准。官网地址:http://www.opengroup.org/。X/Open 组织主要由各大知名公司或者厂商进行支持,这些组织不光遵循 X/Open 组织定义的行业技术标准,也参与到标准的制定。下图展示了 open group 目前主要成员(官网截图):



DTP 模型



  • 应用程序(Application Program ,简称AP):用于定义事务边界(即定义事务的开始和结束),并且在事务边界内对资源进行操作。

  • 资源管理器(Resource Manager,简称RM,一般也称为事务参与者):如数据库、文件系统等,并提供访问资源的方式。

  • 事务管理器(Transaction Manager ,简称TM,一般也称为事务协调者):负责分配事务唯一标识,监控事务的执行进度,并负责事务的提交、回滚等。


XA 规范



这里的接口规范特别多,我们只要来讲讲几个最重要的。


  • xa_start : 在 RM端调用此接口开启一个XA事务,后面需要接上XID 作为参数。

  • xa_end : 取消当前线程与事务的关联, 与 xa_start是配对使用。

  • xa_prepare : 询问RM 是否已经准备好了提交事务。

  • xa_commit : 通知RM 提交事务分支。

  • xa_rollback : 通知 RM 提交回滚事务分支。


XA 二阶段提交


  • 阶段一 :TM通知各个RM准备提交它们的事务分支。如果RM判断自己进行的工作可以被提交,那就就对工作内容进行持久化,再给TM肯定答复;要是发生了其他情况,那给TM的都是否定答复。在发送了否定答复并回滚了已经的工作后,RM就可以丢弃这个事务分支信息。

  • 阶段二 :TM根据阶段1各个RM prepare的结果,决定是提交还是回滚事务。如果所有的RM都prepare成功,那么TM通知所有的RM进行提交;如果有RM prepare失败的话,则TM通知所有RM回滚自己的事务分支。


MySQL 对 XA 协议的支持


MySQL5.0.3开始支持 XA 分布式事务,且只有InnoDB存储引擎支持 XA 事务。


MySQLDTP模型中也是属于资源管理器RM


MySQL XA 事务的 SQL 语法


XA START xid    //开启XA事务,xid是一个唯一值,表示事务分支标识符XA END xid  //结束一个XA事务,XA PREPARE xid 准备提交XA COMMIT xid [ONE PHASE] //提交事务。两阶段提交协议中,如果只有一个RM参与,那么可以优化为一阶段提交XA ROLLBACK xid  //回滚XA RECOVER [CONVERT XID]  //列出所有处于PREPARE阶段的XA事务
复制代码


MySQL xid 详解


mysql 中使用 xid 来作为一个事务分支的标识符。通过 C 语言进行描述,如下:


/∗∗ Transaction branch identification: XID and NULLXID:∗/#define XIDDATASIZE 128  /∗ size in bytes ∗/#define MAXGTRIDSIZE 64  /∗ maximum size in bytes of gtrid ∗/#define MAXBQUALSIZE 64  /∗ maximum size in bytes of bqual ∗/struct xid_t {    long formatID;     /* format identifier */    long gtrid_length; /* value 1-64 */    long bqual_length; /* value 1-64 */    char data[XIDDATASIZE];    };/∗∗ A value of -1 in formatID means that the XID is null.∗/typedef struct xid_t XID;/∗∗ Declarations of routines by which RMs call TMs:∗/extern int ax_reg(int, XID ∗, long);extern int ax_unreg(int, long);
复制代码


  • gtrid :全局事务标识符(global transaction identifier),最大不能超过64字节。

  • bqual :分支限定符(branch qualifier),最大不能超过64字节。

  • formatId:记录gtrid、bqual的格式,类似于memcached中flags字段的作用。

  • data :xid的值,其是 gtrid和bqual拼接后的内容。


MySQL XA 事务状态



JTA 规范


JTA(Java Transaction API):为 J2EE 平台提供了分布式事务服务(distributed transaction)的能力。某种程度上,可以认为JTA规范是XA规范的Java版,其把 XA 规范中规定的 DTP 模型交互接口抽象成 Java 接口中的方法,并规定每个方法要实现什么样的功能。



JTA 定义的接口


  • javax.transaction.TransactionManager : 事务管理器,负责事务的begin, commitrollback 等命令。

  • javax.transaction.UserTransaction:用于声明一个分布式事务。

  • javax.transaction.TransactionSynchronizationRegistry:事务同步注册

  • javax.transaction.xa.XAResource:定义RM提供给TM操作的接口

  • javax.transaction.xa.Xid:事务xid接口。


TM provider:


  • 实现UserTransaction、TransactionManager、Transaction、TransactionSynchronizationRegistry、Synchronization、Xid接口,通过与XAResource接口交互来实现分布式事务。


RM provider:


  • XAResource接口需要由资源管理器者来实现,XAResource接口中定义了一些方法,这些方法将会被TM进行调用,如:

  • start方法:开启事务分支

  • end方法:结束事务分支

  • prepare方法:准备提交

  • commit方法:提交

  • rollback方法:回滚

  • recover方法:列出所有处于PREPARED状态的事务分支


ShardingSphere 对 XA 分布式事务的支持


ShardingSphere 针对 XA 分布式事务的接口以及 JTA 规范,提供了标准的,基于 SPI 实现的org.apache.shardingsphere.transaction.spi.ShardingTransactionManager


public interface ShardingTransactionManager extends AutoCloseable {
/** * Initialize sharding transaction manager. * * @param databaseType database type * @param resourceDataSources resource data sources */ void init(DatabaseType databaseType, Collection<ResourceDataSource> resourceDataSources);
/** * Get transaction type. * * @return transaction type */ TransactionType getTransactionType();
/** * Judge is in transaction or not. * * @return in transaction or not */ boolean isInTransaction();
/** * Get transactional connection. * * @param dataSourceName data source name * @return connection * @throws SQLException SQL exception */ Connection getConnection(String dataSourceName) throws SQLException;
/** * Begin transaction. */ void begin();
/** * Commit transaction. */ void commit();
/** * Rollback transaction. */ void rollback();}
复制代码


对于 XA 分布式事务的支持的具体实现类为 :org.apache.shardingsphere.transaction.xa.XAShardingTransactionManager


在此类中,会调用基于 SPI 实现的org.apache.shardingsphere.transaction.xa.spi.XATransactionManager,来进行 XA 事务的管理操作。


总结


在此篇中,我们了解了分布式事务的 CAP 理论,了解了 X/Open 的 DTP 模型,以及 XA 的接口规范,MySQL 对 XA 协议的支持。最好我们讲解了 JTA 的规范,以及 ShardingSphere 对 XA 事务进行整合的时候定义的 SPI 接口,这些都是很重要的理论基础,在下一篇,我们将详细来讲解基于AtomkikosXATransactionManager的具体实现,以及源码解析。


作者介绍


肖宇,Apache ShardingSphere Committer,开源 hmily 分布式事务框架作者,


开源 soul 网关作者,热爱开源,追求写优雅代码。目前就职入京东数科,参与 ShardingSphere 的开源建设,以及分布式数据库的研发工作。


本文转载自公众号 ShardingSphere 官微(ID:Sharding-Sphere)。


原文链接


Shardingsphere整合Atomikos对XA分布式事务的支持(1)


2020 年 11 月 23 日 10:05615

评论

发布
暂无评论
发现更多内容

[史上最全Java面试题精选集锦]强势来袭,阿里P8大牛整整肝了半年整理出来的!

Java成神之路

Java 编程 程序员 架构 面试

超赞!吃透这份Github点赞120k的Java知识面试笔记Offer拿到手软

比伯

Java 编程 程序员 架构 面试

第5周 技术选型(一)-作业

SuGeek

极客大学架构师训练营

架构师训练营第 1 期 第 8 周作业

李循律(祥龙)

极客大学架构师训练营

架构师训练营 1 期 - 第八周总结(vaik)

行之

极客大学架构师训练营

8.4经典算法

张荣召

8.6非阻塞网络I/O

张荣召

在历史的天空重逢!大话鲲鹏上海记

脑极体

va_list 可变长参数原理

liu_liu

c 可变参数 va_list

训练营第4周作业

爱码士

训练营

过滤Spark数据集的四种方法

大数志

大数据 spark 数据分析 数据科学

8.5网络通信基本原理与性能优化

张荣召

【干货】内存条的基础讲解,够用绝大多数情况

亚兰—硅的传奇official

计算机基础 内存 装机 硬件

训练营第四周学习总结

爱码士

训练营

机器学习的产业化变革中,华为云ModelArts的新成绩单

脑极体

Java集合(1)-- 俯瞰Java集合源码以及分类

秦怀杂货店

Java 源码 Iterator和Iterable JAVA集合

MySql领域经典之作,“不敢自诩为MySql专家,岂敢错过这本神书”

Java成神之路

Java 程序员 架构 面试 编程语言

高可用可伸缩微服务架构:基于Dubbo、SpringCloud和ServiceMesh完整蓝光版PDF分享

Java架构追梦

Java 微服务 dubbo Service Mesh SpringCloud

面试官:Redis 主从复制时网络开小差了怎么整?

云流

redis 学习 java面试

限流、熔断与降级

骑着王八上高速

后台开发 熔断 限流 降级

学习总结--week08

张荣召

Spring改变版本号命名规则:此举对非英语国家很友好

YourBatman

Spring Boot 语义化 Spring Framework 日历化

我画着图,FluentAPI 她自己就生成了

newbe36524

C# .net .net core netcore

高性能-Nginx多进程高并发、低时延、高可靠机制在百万级缓存(redis、memcache)代理中间件中的应用

杨亚洲(专注mongodb及高性能中间件)

nginx memcached 分布式缓存 redis cluster 分布式数据库mongodb

Java开发三年的面经总结,一份面试阿里、网易的面经(高开岗)

周老师

Java 编程 程序员 架构 面试

五年Java开发经验,四面阿里如愿拿到P7级offer,为此我筹备了半年!

Java成神之路

Java 编程 程序员 架构 面试

【薪火计划】02 - 一将功成万骨枯

brave heart

管理

每个程序员都应该知道的数字

多颗糖

数据库 计算机基础 存储

适合初学者的Web Components教程[2019](译)

西贝

Java Web Component 组件

flink-sql流计算可视化UI平台

无情

flink 实时计算 平台

第 4 周作业

Steven

极客大学架构师训练营

Shardingsphere整合Atomikos对XA分布式事务的支持(1)-InfoQ