Apache ShardingSphere XA分布式事务系列(一)
Shardingsphere对XA分布式事务的支持
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协议的支持
MySQL
从5.0.3
开始支持XA分布式事务,且只有InnoDB
存储引擎支持XA事务。 MySQL
在DTP
模型中也是属于资源管理器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
,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
。
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的开源建设,以及分布式数据库的研发工作。

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
一口气说出 9种 分布式ID生成方式(架构师必修课)
一、为什么要用分布式ID? 在说分布式ID的具体实现之前,我们来简单分析一下为什么用分布式ID?分布式ID应该满足哪些特征? 1、什么是分布式ID? 拿MySQL数据库举个栗子: 在我们业务数据量不大的时候,单库单表完全可以支撑现有业务,数据再大一点搞个MySQL主从同步读写分离也能对付。 但随着数据日渐增长,主从同步也扛不住了,就需要对数据库进行分库分表,但分库分表后需要有一个唯一ID来标识一条数据,数据库的自增ID显然不能满足需求;特别一点的如订单、优惠券也都需要有唯一ID做标识。此时一个能够生成全局唯一ID的系统是非常必要的。那么这个全局唯一ID就叫分布式ID。 2、那么分布式ID需要满足那些条件? 全局唯一:必须保证ID是全局性唯一的,基本要求 高性能:高可用低延时,ID生成响应要块,否则反倒会成为业务瓶颈 高可用:100%的可用性是骗人的,但是也要无限接近于100%的可用性 好接入:要秉着拿来即用的设计原则,在系统设计和实现上要尽可能的简单 趋势递增:最好趋势递增,这个要求就得看具体业务场景了,一般不严格要求 二、 分布式ID都有哪些生成方式? 今天主要分析一下以下9种,分布...
- 下一篇
Apache ShardingSphere整合Atomikos源码解析
Shardingsphere整合Atomikos对XA分布式事务的支持 Apache ShardingSphere 是一套开源的分布式数据库中间件解决方案组成的生态圈,它由 JDBC、Proxy 和 Sidecar(规划中)这 3 款相互独立,却又能够混合部署配合使用的产品组成。 它们均提供标准化的数据分片、分布式事务和数据库治理功能,可适用于如 Java 同构、异构语言、云原生等各种多样化的应用场景。 ShardingSphere 已于2020年4月16日成为 Apache 软件基金会的顶级项目。 咋们话不多,接上篇,我们直接进入正题。 Atomikos简单介绍 Atomikos(https://www.atomikos.com/),其实是一家公司的名字,提供了基于JTA规范的XA分布式事务TM的实现。其旗下最著名的产品就是事务管理器。产品分两个版本: TransactionEssentials:开源的免费产品; ExtremeTransactions:上商业版,需要收费。 这两个产品的关系如下图所示: ExtremeTransactions在TransactionEssential...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- Eclipse初始化配置,告别卡顿、闪退、编译时间过长
- CentOS8,CentOS7,CentOS6编译安装Redis5.0.7
- Docker安装Oracle12C,快速搭建Oracle学习环境
- CentOS6,7,8上安装Nginx,支持https2.0的开启
- SpringBoot2整合Redis,开启缓存,提高访问速度
- Jdk安装(Linux,MacOS,Windows),包含三大操作系统的最全安装
- CentOS8安装MyCat,轻松搞定数据库的读写分离、垂直分库、水平分库
- CentOS7设置SWAP分区,小内存服务器的救世主
- Windows10,CentOS7,CentOS8安装MongoDB4.0.16
- CentOS7安装Docker,走上虚拟化容器引擎之路