技术领域
本发明涉及计算机数据库领域,具体涉及一种分布式数据库中间件解决方法。
背景技术
在基于微服务的分布式应用流行环境下,越来越多的应用场景要求对多个服务的访问及其相对应的多个数据库资源能纳入到同一个事务当中,出现了分布式事务。在分布式的应用场景下,它却成为系统性能的制约。如何让数据库在分布式场景下满足ACID的特性或找寻相应的替代方法,是分布式事务的重点解决方向。目前关于事务的解决主要有本地事务、两阶段提交事务、柔性事务。
本地事务:不开启任何分布式事务管理器的前提下,让每个数据节点各自管理自己的事务。它们之间没有协调以及通信的能力,也并不互相知晓其他数据节点事务的成功与否。本地事务在性能方面无任何损耗,但在强一致性以及最终一致性方面则力不从心。
两阶段提交事务:事务执行在过程中需要将所需资源全部锁定,它更加适用于执行时间确定的短事务。对于长事务来说,整个事务进行期间对数据的独占,将导致对热点数据依赖的业务系统并发性能衰退明显。
柔性事务:柔性事务的理念则是通过业务逻辑将互斥锁操作从资源层面上移至业务层面。通过放宽对强一致性要求,来换取系统吞吐量的提升。
在开发者的日常工作中,由于应用的场景不同,需要开发者能够合理的在性能与功能之间权衡各种分布式事务。
而强一致的事务与柔性事务的API和功能并不完全相同,在它们之间并不能做到自由的透明切换。在开发决策阶段,就不得不在强一致的事务和柔性事务之间抉择,使得设计和开发成本被大幅增加。
基于XA的强一致事务使用相对简单,但是无法很好的应对互联网的高并发或复杂系统的长事务场景;柔性事务则需要开发者对应用进行改造,接入成本非常高,并且需要开发者自行实现资源锁定和反向补偿。
发明内容
因此,本发明针对上述问题,整合现有的成熟事务,为本地事务、两阶段事务和柔性事务提供统一的分布式事务接口,弥补当前方法的不足,提供一种分布式事务解决方法。
为达到上述目的,本发明采用下述技术方案:
本发明一方面提供一种分布式数据库中间件解决方法,所述方法通过整合现有成熟事务,为本地事务、两阶段事务和柔性事务提供统一的分布式事务接口,整合后的事务包括:
基于XA两阶段事务和基于SEATA柔性事务;
其中,
所述基于XA两阶段事务整合了XA事务和两阶段事务;
所述基于SEATA柔性事务整合了SEATA框架中的Seata AT事务。
在一个具体实施例中,所述方法包括集成嵌入式的事务管理器,以jar包的形式提供服务。
在一个具体实施例中,所述基于XA两阶段事务提交采用的是X/OPEN组织所定义的DTP模型所抽象的应用工程,事务管理器和资源管理器间采用XA的协议进行双向通信。
在一个具体实施例中,所述基于XA两阶段事务包括准备阶段,数据库除了被动接受提交指令外,还能够反向通知调用方事务是否能够被提交;事务管理器收集所有分支事务的准备结果,并于最后进行原子提交。
在一个具体实施例中,所述方法在整合XA事务时,采用分离XA事务管理和连接池管理的方式,所述基于XA两阶段事务能够同时使用XA和非XA的连接池。
在一个具体实施例中,所述基于SEATA柔性事务模型包括事务管理器,资源管理器和事务协调器;
其中,
事务协调器是一个独立部署的服务,事务管理器和资源管理器以jar包的方式同业务应用一同部署,它们同事务协调器建立长连接,在整个事务生命周期内,保持远程通信;
事务管理器是全局事务的发起方,负责全局事务的开启,提交和回滚;
资源管理器是全局事务的参与者,负责分支事务的执行结果上报,并且通过事务协调器的协调进行分支事务的提交和回滚。
在一个具体实施例中,所述基于SEATA柔性事务面向DataSource接口,对用户配置的数据源进行聚合。
在一个具体实施例中,所述方法在整合Seata AT事务时,将DataSource接口封装为基于SEATA的DataSource接口。
在一个具体实施例中,所述方法在分片物理SQL采取多线程方式执行,整合SeataAT事务时,在主线程和子线程间进行全局事务ID的上下文传递。
在一个具体实施例中,所述基于XA两阶段事务的实施方法包括以下步骤:
S101:开启全局事务;
收到接入端set autoCommit=0时,XADCSTransactionManager将调用具体的XA事务管理器开启XA全局事务,以XID的形式进行标记;
S102:执行真实分片SQL;
XADCSTransactionManager将数据库连接所对应的XAResource注册到当前XA事务中之后,事务管理器在此阶段发送XAResource.start命令至数据库;数据库在收到XAResource.end命令之前的所有SQL操作,被标记为XA事务;
S103:提交或回滚事务;
XADCSTransactionManager在接收到接入端的提交命令后,委托实际的XA事务管理器进行提交动作,事务管理器将收集到的当前线程中所有XAResource,并发送XAResource.end指令,用以标记此XA事务边界;接着依次发送prepare指令,收集所有参与XAResource的投票;
若所有XAResource的反馈结果均为正确,则调用commit指令进行最终提交;
若有任意XAResource的反馈结果不正确,则调用rollback指令进行回滚;
在事务管理器发出提交指令后,任何XAResource产生的异常都会通过恢复日志进行重试;
其中,
XADCSTransactionManager为所述一种分布式数据库中间件解决方法的分布式事务的XA实现类;对多数据源进行管理和适配,并且将相应事务的开启、提交和回滚操作委托给具体的XA事务管理器。
在一个具体实施例中,所述基于SEATA柔性事务的实施方法包括以下步骤:
S201:引擎初始化;
包含基于SEATA柔性事务的应用启动时,用户配置的数据源根据seata.conf的配置,适配为SEATA事务所需的DataSourceProxy,并且注册至资源管理器中;
S202:开启全局事务;
事务管理器控制全局事务的边界,事务管理器通过向事务协调器发送Begin指令,获取全局事务ID,所有分支事务通过此全局事务ID,参与到全局事务中;全局事务ID的上下文存放在当前线程变量中;
S203:执行真实分片SQL;
处于Seata全局事务中的分片SQL通过资源管理器生成undo快照,并且发送participate指令至事务协调器,加入到全局事务中;
S204:提交或回滚事务;
提交基于SEATA柔性事务时,事务管理器会向事务协调器发送全局事务的提交或回滚指令,事务协调器根据全局事务ID协调所有分支事务进行提交或回滚。
本发明的有益效果如下:
本发明能够完全兼容所有的分布式事务场景,并在性能上达到最优,但在CAP定理所指导下,分布式事务必然有所取舍。本发明希望能够将分布式事务的选择权交给使用者,在不同的场景用使用最适合的分布式事务解决方法。该方法整合现有的成熟事务,为本地事务、两阶段事务和柔性事务提供统一的分布式事务接口,并弥补当前方法的不足。
本发明所提供的方法中基于XA两阶段事务支持项支持数据分片后的跨库事务;两阶段提交保证操作的原子性和数据的强一致性;
服务宕机重启后,提交/回滚中的事务可自动恢复;
支持同时使用XA和非XA的连接池。
本发明所提供的方法中基于SEATA柔性事务的支持项支持数据分片后的跨库事务;
支持RC隔离级别;
通过undo快照进行事务回滚;
支持服务宕机后的,自动恢复提交中的事务。
附图说明
为了更清楚地说明本申请具体实施方式或现有的技术方案,下面将对具体实施方式或现有的技术描述中所需要使用的附图作简单地介绍,显而易见的,下面描述中的附图是本申请的一种实施方式,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。
图1示出根据本发明一个实施例的事务管理器和资源管理器事务交换信息架构图。
图2示出根据本发明一个实施例的基于XA两阶段事务架构图。
图3示出根据本发明一个实施例的SEATA架构图。
图4示出根据本发明一个实施例的基于SEATA柔性事务架构图。
具体实施方式
为了使本发明的技术方案更加清楚明白,以下结合附图及实施例,对本发明进行进一步详细说明。以下通过具体实施例对本发明进行了详细的说明,但这些并非构成对本发明的限制。在不脱离本发明原理的情况下,本领域的技术人员可以做出变形与改进,也应视为本发明的保护范围。
本发明提供一种分布式数据库中间件解决方法(该方法简称DCS),所述方法整合现有成熟事务,为本地事务、两阶段事务和柔性事务提供统一的分布式事务接口,整合后的事务包括:
基于XA两阶段事务(XA即XA协议,由X/Open组织提出的分布式事务处理的规范)和基于SEATA柔性事务(SEATA为阿里集团和蚂蚁金服联合打造的分布式事务框架);
首先是基于XA两阶段事务:
基于XA两阶段事务整合了XA事务和两阶段事务;
两阶段事务提交采用的是X/OPEN组织所定义的DTP模型所抽象的应用工程,TM(TransactionManager的缩写,即事务管理器)和RM(ResourceManager的缩写,即资源管理器)概念来保证分布式事务的强一致性,其中事务管理器TM与资源管理器RM间采用XA的协议进行双向通信。如图1,图1示出根据本发明一个实施例的事务管理器和资源管理器事务交换信息架构图,图中,应用工程AP使用一组来自资源管理器RMs的资源并通过TX接口定义事务边界。
与传统的本地事务相比,XA事务增加了准备阶段,数据库除了被动接受提交指令外,还能够反向通知调用方事务是否可以被提交。TM可以收集所有分支事务的准备结果,并于最后进行原子提交,以保证事务的强一致性。
基于XA两阶段事务整合了上述XA事务和两阶段事务,因此上述XA事务和两阶段事务的特性也是基于XA两阶段事务的特性。
Java通过定义JTA接口实现了XA模型,JTA接口中的资源管理器需要数据库厂商提供XA驱动实现,事务管理器则需要事务管理器的厂商实现,传统的事务管理器需要同应用服务器绑定,因此使用的成本很高。而嵌入式的事务管器能够以jar包的形式提供服务,同DCS集成后,可保证分片后跨库事务强一致性。
通常,只有使用了事务管理器厂商所提供的XA事务连接池,才能支持XA的事务。DCS在整合XA事务时,采用分离XA事务管理和连接池管理的方式,能够同时使用XA和非XA的连接池,做到对应用程序的零侵入。
如图2,图2示出根据本发明一个实施例的基于XA两阶段事务架构图。
本发明基于XA两阶段事务的实施方法如下:
S101:开启全局事务;
收到接入端set autoCommit=0时,XADCSTransactionManager将调用具体的XA事务管理器开启XA全局事务,以XID的形式进行标记;
S102:执行真实分片SQL;
XADCSTransactionManager将数据库连接所对应的XAResource注册到当前XA事务中之后,事务管理器在此阶段发送XAResource.start命令至数据库;数据库在收到XAResource.end命令之前的所有SQL操作,被标记为XA事务;
例如:
XAResource1.start##Enlist阶段执行
statement.execute("sql1");##模拟执行一个分片SQL1
statement.execute("sql2");##模拟执行一个分片SQL2
XAResource1.end##提交阶段执行
上例中的sql1和sql2将会被标记为XA事务。
S103:提交或回滚事务;
XADCSTransactionManager在接收到接入端的提交命令后,委托实际的XA事务管理器进行提交动作,事务管理器将收集到的当前线程中所有XAResource,并发送XAResource.end指令,用以标记此XA事务边界;接着依次发送prepare指令,收集所有参与XAResource的投票;
若所有XAResource的反馈结果均为正确,则调用commit指令进行最终提交;
若有任意XAResource的反馈结果不正确,则调用rollback指令进行回滚;
在事务管理器发出提交指令后,任何XAResource产生的异常都会通过恢复日志进行重试;以保证提交阶段的操作原子性,和数据强一致性。
例如:
XAResource1.prepare##ack:yes
XAResource2.prepare##ack:yes
XAResource1.commit
XAResource2.commit
XAResource1.prepare##ack:yes
XAResource2.prepare##ack:no
XAResource1.rollback
XAResource2.rollback
其中,
XADCSTransactionManager为DCS方法的分布式事务的XA实现类;对多数据源进行管理和适配,并且将相应事务的开启、提交和回滚操作委托给具体的XA事务管理器。
基于SEATA柔性事务:
基于SEATA柔性事务整合了SEATA框架中的Seata AT事务。
SEATA是阿里集团和蚂蚁金服联合打造的分布式事务框架。其AT事务的目标是在微服务架构下,提供增量的事务ACID语意,让开发者像使用本地事务一样,使用分布式事务,核心理念与DCS相同。
Seata AT事务模型包含TM,RM和TC(Transaction coordinator的简写,即事务协调器)。
TC是一个独立部署的服务,TM和RM以jar包的方式同业务应用一同部署,它们同TC建立长连接,在整个事务生命周期内,保持远程通信。
TM是全局事务的发起方,负责全局事务的开启,提交和回滚。
RM是全局事务的参与者,负责分支事务的执行结果上报,并且通过TC的协调进行分支事务的提交和回滚。
SEATA管理的分布式事务的典型生命周期如下:
TM要求TC开始一个全新的全局事务,TC生成一个代表该全局事务的XID;
XID贯穿于微服务的整个调用链;
作为该XID对应到的TC下的全局事务的一部分,RM注册本地事务;
TM要求TC提交或回滚XID对应的全局事务;
TC驱动XID对应的全局事务下的所有分支事务完成提交或回滚。
如图3,图3示出根据本发明一个实施例的SEATA架构图。
本方法在整合Seata AT事务时,需要将TM,RM和TC的模型融入DCS的分布式事务方法中。在数据库资源上,Seata通过对接DataSource接口,让JDBC操作可以同TC进行远程通信。同样,DCS也面向DataSource接口,对用户配置的数据源进行聚合。因此,将DataSource接口封装为基于Seata的DataSource接口后,就可以将Seata AT事务融入到DCS方法中。
因基于SEATA柔性事务整合了SEATA框架中的Seata AT事务。因此上述Seata AT事务的特性也是基于SEATA柔性事务所具有的。
如图4,图4示出根据本发明一个实施例的基于SEATA柔性事务架构图,其中,TM C/R为事务管理器提交或回滚。
本实施例基于SEATA柔性事务的实施方法如下:
S201:引擎初始化;
包含基于SEATA柔性事务的应用启动时,用户配置的数据源根据seata.conf的配置,适配为SEATA事务所需的DataSourceProxy,并且注册至资源管理器中;
S202:开启全局事务;
事务管理器控制全局事务的边界,事务管理器通过向事务协调器发送Begin指令,获取全局事务ID,所有分支事务通过此全局事务ID,参与到全局事务中;全局事务ID的上下文存放在当前线程变量中;
S203:执行真实分片SQL;
处于Seata全局事务中的分片SQL通过资源管理器生成undo快照,并且发送participate指令至事务协调器,加入到全局事务中;
S204:提交或回滚事务;
提交基于SEATA柔性事务时,事务管理器会向事务协调器发送全局事务的提交或回滚指令,事务协调器根据全局事务ID协调所有分支事务进行提交或回滚。
其中,由于DCS的分片物理SQL采取多线程方式执行,因此整合Seata AT事务时,需要在主线程和子线程间进行全局事务ID的上下文传递。
显然,本发明的上述实施例仅仅是为清楚地说明本发明所作的举例,而并非是对本发明的实施方式的限定,对于所属领域的普通技术人员来说,在上述说明的基础上还可以做出其它不同形式的变化或变动,这里无法对所有的实施方式予以穷举,凡是属于本发明的技术方案所引伸出的显而易见的变化或变动仍处于本发明的保护范围之列。
机译: 一种分布式系统中实体之间冲突的解决方法
机译: 一种分布式系统中实体之间冲突的解决方法
机译: 一种分布式系统中实体之间冲突的解决方法