您好!
欢迎来到京东云开发者社区
登录
首页
博文
课程
大赛
工具
用户中心
开源
首页
博文
课程
大赛
工具
开源
更多
用户中心
开发者社区
>
博文
>
Shardingsphere整合Atomikos对XA分布式事务的支持(1)
分享
打开微信扫码分享
点击前往QQ分享
点击前往微博分享
点击复制链接
Shardingsphere整合Atomikos对XA分布式事务的支持(1)
Apache ShardingSphere
2020-12-23
IP归属:未知
112360浏览
Apache ShardingSphere 是一套开源的分布式数据库中间件解决方案组成的生态圈,它由 JDBC、Proxy 和 Sidecar(规划中)这 3 款相互独立,却又能够混合部署配合使用的产品组成。它们均提供标准化的数据分片、分布式事务和数据库治理功能,可适用于如 Java 同构、异构语言、云原生等各种多样化的应用场景。 ShardingSphere 已于2020年4月16日成为 Apache 软件基金会的顶级项目。 # 分布式系统CAP理论 ![](//img1.jcloudcs.com/developer.jdcloud.com/05b74e9c-c6c3-4739-a73b-1e096428ba3b20201209191616.png) #### 一致性(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目前主要成员(官网截图): ![](//img1.jcloudcs.com/developer.jdcloud.com/68f2899e-2350-4dcb-80f1-9f1129a084d020201209192009.png) #### DTP模型 ![](//img1.jcloudcs.com/developer.jdcloud.com/97f1b96c-ed7c-4acb-b7f7-fa173da284d220201209192044.png) + 应用程序(Application Program ,简称AP):用于定义事务边界(即定义事务的开始和结束),并且在事务边界内对资源进行操作。 + 资源管理器(Resource Manager,简称RM,一般也称为事务参与者):如数据库、文件系统等,并提供访问资源的方式。 + 事务管理器(Transaction Manager ,简称TM,一般也称为事务协调者):负责分配事务唯一标识,监控事务的执行进度,并负责事务的提交、回滚等。 #### XA规范 ![](//img1.jcloudcs.com/developer.jdcloud.com/f4624130-79f2-488a-af62-4c1e4a8530ab20201209192303.png) 这里的接口规范特别多,我们只要来讲讲几个最重要的。 + 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协议的支持 MySQL 从5.0.3开始支持XA分布式事务,且只有InnoDB存储引擎支持XA事务。 MySQL 在DTP模型中也是属于资源管理器RM。 #### MySQL XA 事务的 SQL语法 ```c 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语言进行描述,如下: ```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事务状态 ![](//img1.jcloudcs.com/developer.jdcloud.com/2f3613fd-f3ff-4dcb-b5a0-37625e390e8820201209192714.png) #### JTA规范 JTA(Java Transaction API):为J2EE平台提供了分布式事务服务(distributed transaction)的能力。某种程度上,可以认为JTA规范是XA规范的Java版,其把XA规范中规定的DTP模型交互接口抽象成Java接口中的方法,并规定每个方法要实现什么样的功能。 ![](//img1.jcloudcs.com/developer.jdcloud.com/e494a607-dd77-495d-b706-8bfe4b32399d20201209192846.png) #### JTA 定义的接口 + javax.transaction.TransactionManager : 事务管理器,负责事务的begin, commit,rollback 等命令。 + 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。 ```c 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开源分布式数据库中间件应用详解
下一篇:万字长文详解ShardingSphere对XA分布式事务的支持
Apache ShardingSphere
文章数
96
阅读量
231327
作者其他文章
01
突破关系型数据库桎梏:云原生数据库中间件核心剖析
数据库技术的发展与变革方兴未艾,NewSQL的出现,只是将各种所需技术组合在一起,而这些技术组合在一起所实现的核心功能,推动着云原生数据库的发展。 NewSQL的三种分类中,新架构和云数据库涉及了太多与数据库相关的底层实现,为了保证本文的范围不至太过发散,我们重点介绍透明化分片数据库中间件的核心功能与实现原理,另外两种类型的NewSQL在核心功能上类似,但实现原理会有所差别。
01
Apache ShardingSphere数据脱敏全解决方案详解(上)
Apache ShardingSphere针对新业务上线、旧业务改造分别提供了相应的全套脱敏解决方案。
01
Shardingsphere整合Narayana对XA分布式事务的支持(4)
ShardingSphere对于XA方案,提供了一套SPI解决方案,对Narayana进行了整合,Narayana初始化流程,开始事务流程,获取连接流程,提交事务流程,回滚事务流程。
01
从中间件到分布式数据库生态,ShardingSphere 5.x革新变旧
5.x 是 Apache ShardingSphere从分库分表中间件向分布式数据库生态转化的里程碑,从 4.x 版本后期开始打磨的可插拔架构在 5.x 版本已逐渐成型,项目的设计理念和 API 都进行了大幅提升。欢迎大家测试使用!
Apache ShardingSphere
文章数
96
阅读量
231327
作者其他文章
01
突破关系型数据库桎梏:云原生数据库中间件核心剖析
01
Apache ShardingSphere数据脱敏全解决方案详解(上)
01
Shardingsphere整合Narayana对XA分布式事务的支持(4)
01
从中间件到分布式数据库生态,ShardingSphere 5.x革新变旧
添加企业微信
获取1V1专业服务
扫码关注
京东云开发者公众号