Apache ShardingSphere 是一套开源的分布式数据库中间件解决方案组成的生态圈,它由 JDBC、Proxy 和 Sidecar(规划中)这 3 款相互独立,却又能够混合部署配合使用的产品组成。它们均提供标准化的数据分片、分布式事务和数据库治理功能,可适用于如 Java 同构、异构语言、云原生等各种多样化的应用场景。
ShardingSphere 已于 2020 年 4 月 16 日成为 Apache 软件基金会的顶级项目。
all nodes see the same data at the same time
,即更新操作成功并返回客户端完成后,所有节点在同一时间的数据完全一致,不能存在中间状态。有限的时间内是指
:对于用户的一个操作请求,系统必须能够在指定的时间内返回对应的处理结果,如果超过了这个时间范围,那么系统就被认为是不可用的。返回结果
是可用性的另一个非常重要的指标,它要求系统在完成对用户请求的处理后,返回一个正常的响应结果,不论这个结果是成功还是失败。X/Open,即现在的 open group,是一个独立的组织,主要负责制定各种行业技术标准。官网地址:http://www.opengroup.org/。X/Open 组织主要由各大知名公司或者厂商进行支持,这些组织不光遵循 X/Open 组织定义的行业技术标准,也参与到标准的制定。下图展示了 open group 目前主要成员(官网截图):
这里的接口规范特别多,我们只要来讲讲几个最重要的。
xa_start
: 在 RM
端调用此接口开启一个XA
事务,后面需要接上XID
作为参数。xa_end
: 取消当前线程与事务的关联, 与 xa_start
是配对使用。xa_prepare
: 询问RM
是否已经准备好了提交事务。xa_commit
: 通知RM
提交事务分支。xa_rollback
: 通知 RM
提交回滚事务分支。阶段一
:TM通知各个RM准备提交它们的事务分支。如果RM判断自己进行的工作可以被提交,那就就对工作内容进行持久化,再给TM肯定答复;要是发生了其他情况,那给TM的都是否定答复。在发送了否定答复并回滚了已经的工作后,RM就可以丢弃这个事务分支信息。阶段二
:TM根据阶段1各个RM prepare的结果,决定是提交还是回滚事务。如果所有的RM都prepare成功,那么TM通知所有的RM进行提交;如果有RM prepare失败的话,则TM通知所有RM回滚自己的事务分支。MySQL
从5.0.3
开始支持 XA 分布式事务,且只有InnoDB
存储引擎支持 XA 事务。
MySQL
在DTP
模型中也是属于资源管理器RM
。
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 来作为一个事务分支的标识符。通过 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拼接后的内容。JTA(Java Transaction API)
:为 J2EE 平台提供了分布式事务服务(distributed transaction)的能力。某种程度上,可以认为JTA规范是XA规范的Java版
,其把 XA 规范中规定的 DTP 模型交互接口抽象成 Java 接口中的方法,并规定每个方法要实现什么样的功能。
javax.transaction.TransactionManager
: 事务管理器,负责事务的begin
, commit
,rollback
等命令。javax.transaction.UserTransaction
:用于声明一个分布式事务。javax.transaction.TransactionSynchronizationRegistry
:事务同步注册javax.transaction.xa.XAResource
:定义RM
提供给TM
操作的接口javax.transaction.xa.Xid
:事务xid接口。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)。
原文链接:
领取专属 10元无门槛券
私享最新 技术干货