一种残膜回收机防缠绕挑膜装置的制 一种秧草收获机用电力驱动行走机构

SQL数据库中分布式事务的处理方法、装置及系统与流程

2022-04-14 03:14:48 来源:中国专利 TAG:
sql数据库中分布式事务的处理方法、装置及系统
技术领域
:1.本发明涉及数据库
技术领域
:,特别是涉及sql数据库中分布式事务的处理方法、装置及系统。
背景技术
::2.面对日益增长的海量数据,传统的集中式数据库的弊端日益显现,分布式数据库相比于传统的集中式数据库主要有如下优点:1、更强的扩展性。分布式数据库可以通过增添存储节点来实现存储容量的线性扩展,而集中式数据库的可扩展性十分有限。3.2、更高的并发访问能力。分布式数据库由于采用多台主机组成存储集群,所以相对集中式数据库,它可以提供更高的用户并发访问量。4.3、更高的可靠性和更好的可用性。由于数据分布在多个场地并有许多副本数据,在个别场地或个别通信链路发生故障时,不致于导致整个系统的崩溃,而且系统的局部故障不会引起全局失控。5.对于sql数据库,如mysql数据库,可以通过xa(extendedarchitecture,由x/open组织提出的分布式交易处理的规范)协议发起xa事务来实现分布式事务,进而可以允许多个mysql实例共同参与到一个全局事务中,通过xa事务使得mysql有能力成为分布式数据库。6.但在事实上,mysql仍然是一个单机数据库管理系统,所有基于mysql的分布式数据库,在产品力上相比于业界上原生的分布式数据库来说,有所欠缺,特别是,现有的mysql要在内核层面实现高效的分布式一致性查询,几乎是没有手段的。技术实现要素:7.鉴于上述问题,提出了以便提供克服上述问题或者至少部分地解决上述问题的sql数据库中分布式事务的处理方法、装置及系统,包括:一种sql数据库中分布式事务的处理方法,sql数据库包括多个数据库节点,所述方法包括:在至少两个数据库节点发起分布式事务;针对至少两个数据库节点中每个数据库节点,在分布式事务提交成功时,确定并持久化分布式事务的全局事务提交号,分布式事务的全局事务提交号为按照在所有分布式事务中提交成功的顺序确定的;响应于针对sql数据库的一致性查询,在当前构建的一致性视图的基础上,根据扫描的数据记录对应的目标分布式事务的全局事务提交号,确定数据记录的可见性判断结果。8.可选地,当前构建的一致性视图对应有一第一全局事务提交号,根据扫描的数据记录对应的目标分布式事务的全局事务提交号,确定数据记录的可见性判断结果,包括:在目标分布式事务的全局事务提交号小于或等于第一全局事务提交号的情况下,判定数据记录为可见状态;在目标分布式事务的全局事务提交号大于第一全局事务提交号的情况下,判定数据记录为不可见状态。9.可选地,分布式事务的全局事务提交号为单调递增的时序值。10.可选地,还包括:在分布式事务提交过程中,持久化分布式事务的事务状态;在根据扫描的数据记录对应的目标分布式事务的全局事务提交号,确定数据记录的可见性判断结果之前,还包括:查询扫描的数据记录对应的目标分布式事务的事务状态;在目标分布式事务的事务状态为提交成功状态时,查询目标分布式事务的全局事务提交号;在目标分布式事务的事务状态为未提交成功状态时,控制一致性查询进入等待状态,直至目标分布式事务的事务状态更新为提交成功状态时,查询目标分布式事务的全局事务提交号。11.可选地,分布式事务为基于两阶段提交协议进行提交,事务状态与分布式事务在两阶段提交协议中所处的阶段相对应。12.可选地,数据记录存储有用于指向目标分布式事务对应的事务槽的事务槽地址,还包括:在分布式事务启动时,在预置的事务表中分配分布式事务对应的事务槽,事务槽用于持久化分布式事务的全局事务提交号和分布式事务的事务状态。13.可选地,还包括:当对目标事务槽进行复用时,判断目标事务槽对应的分布式事务是否已结束,并在目标事务槽对应的分布式事务结束的情况下,允许对目标事务槽进行复用。14.可选地,还包括:在存在至少两个分布式事务修改同一个数据记录时,通过事务锁阻塞除在先进行修改的分布式事务外的其他分布式事务,直至在先进行修改的分布式事务获得全局事务提交号并提交。15.可选地,还包括:在对数据记录的历史版本进行清理时,确定第二全局事务提交号;在当前历史版本对应的分布式事务的全局事务提交号小于或等于第二全局事务提交号的情况下,对当前历史版本进行清理;在当前历史版本对应的分布式事务的全局事务提交号大于第二全局事务提交号的情况下,对第二全局事务提交号进行增大。16.一种sql数据库中分布式事务的处理装置,sql数据库包括多个数据库节点,所述装置包括:分布式事务发起模块,用于在至少两个数据库节点发起分布式事务;全局事务提交号持久化模块,用于针对至少两个数据库节点中每个数据库节点,在分布式事务提交成功时,确定并持久化分布式事务的全局事务提交号,分布式事务的全局事务提交号为按照在所有分布式事务中提交成功的顺序确定的;一致性查询模块,用于响应于针对sql数据库的一致性查询,在当前构建的一致性视图的基础上,根据扫描的数据记录对应的目标分布式事务的全局事务提交号,确定数据记录的可见性判断结果。17.一种sql数据库中分布式事务的处理系统,sql数据库包括多个数据库节点,处理系统包括服务组件和处理模块;服务组件,用于在sql数据库中分布式事务提交成功时,生成分布式事务的全局事务提交号;处理模块,用于在sql数据库中至少两个数据库节点发起分布式事务的情况下,针对至少两个数据库节点中每个数据库节点,在分布式事务提交成功时,确定并持久化分布式事务的全局事务提交号;响应于针对sql数据库的一致性查询,在当前构建的一致性视图的基础上,根据扫描的数据记录对应的目标分布式事务的全局事务提交号,确定数据记录的可见性判断结果;其中,分布式事务的全局事务提交号为按照在所有分布式事务中提交成功的顺序确定的。18.一种电子设备,包括处理器、存储器及存储在存储器上并能够在处理器上运行的计算机程序,计算机程序被处理器执行时实现如上所述的sql数据库中分布式事务的处理方法。19.一种计算机可读存储介质,计算机可读存储介质上存储计算机程序,计算机程序被处理器执行时实现如上所述的sql数据库中分布式事务的处理方法。20.本发明实施例具有以下优点:在本发明实施例中,通过在至少两个数据库节点发起分布式事务,然后针对至少两个数据库节点中每个数据库节点,在分布式事务提交成功时,确定并持久化分布式事务的全局事务提交号,响应于针对所述sql数据库的一致性查询,在当前构建的一致性视图的基础上,根据扫描的数据记录对应的目标分布式事务的全局事务提交号,确定数据记录的可见性判断结果,实现了对sql数据库中分布式一致性查询的优化,能够根据分布式事务的提交顺序来进行可见性判断,保证了一致性查询的准确性、高效性。附图说明21.为了更清楚地说明本发明的技术方案,下面将对本发明的描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动性的前提下,还可以根据这些附图获得其他的附图。22.图1是本发明一实施例提供的一种sql数据库中分布式事务的处理方法的步骤流程图;图2是本发明一实施例提供的另一种sql数据库中分布式事务的处理方法的步骤流程图;图3是本发明一实施例提供的一种系统结构的示意图;图4是本发明一实施例提供的一种sql数据库中分布式事务的处理装置的结构框图;图5是本发明一实施例提供的一种sql数据库中分布式事务的处理系统的结构框图。具体实施方式23.为使本发明的上述目的、特征和优点能够更加明显易懂,下面结合附图和具体实施方式对本发明作进一步详细的说明。显然,所描述的实施例是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有作出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。24.对于sql数据库,如mysql数据库,其可以通过xa协议发起xa事务来实现分布式事务,进而可以允许多个mysql实例共同参与到一个全局事务中。在mysql数据库中,通过xa事务实现分布式事务具体如下:xastartxid(xid是用于唯一标识全局的xa事务):开启一个事务,并将事务置于active状态,此后执行的sql语句都将置于该是事务中。25.xaendxid:将事务置于idle状态,表示事务内的sql操作完成。26.xapreparexid:实现事务提交的准备工作,事务状态置于prepared状态。事务如果无法完成提交前的准备操作,该语句会执行失败。27.xacommitxid:事务最终提交,完成持久化。28.xarollbackxid:事务回滚终止。29.xarecover:查看mysql中存在的prepared状态的xa事务。30.对于执行分布式事务的数据库,需要进行分布式的一致性查询,一致性查询最核心的问题在于:如何在多个分布式节点之间采用同一个视图,即看到一致性的结果。而从上文可见,在多个mysql分布式节点之间,同一个全局分布式事务的标识号是xid,会存在以下问题:1、分布式事务并发执行时,分布式事务因为网络、负载、调度等原因,在多个分布式mysql节点的执行顺序不同。31.例如,有两个分布式事务dt_a、dt_b,分布式事务dt_a在两个分布式节点(node1,node2)上执行的本地事务是lt_a1、lt_a2,分布式事务dt_b在两个分布式节点(node1,node2)上执行的本地事务是lt_b1,lt_b2,它们的执行顺序可能是:node1:lt_a1,lt_b1node2:lt_b2,lt_a2可见,在任何时候看到的数据库全局状态,都不应该是:lt_a1,lt_b1,lt_b2,而由于执行顺序的不同,确实会出现这样的情况,因为此时看到的dt_a事务缺失了在node2的修改lt_a2,看到了一个不一致的数据库状态。32.2、xid只是一个xa事务的唯一标识,在xa事务启动的时候指定,然而事务的可见性仅仅取决于事务的提交顺序,而多个分布式事务在不同的分布式mysql节点上的提交顺序也不同。33.具体而言,事务的可见性由事务的提交顺序决定,而xid是xa事务启动时分配的唯一标识。和提交顺序没有关系(即xid不能表示事务的提交顺序),而mysql只有xid做不到全局一致性读。34.3、xid虽然持久化在undo表空间中,但在xa事务结束后(提交或回滚),就会被purge系统(不会再有查询需要看的历史版本没有存在的必要,purge系统会定期按需清理掉这些历史版本数据)清理掉。35.4、对于多个分布式mysql节点,通过维护xid信息来构建视图是困难的,而这样的视图在多个分布式节点以及client节点之间共享也是困难的。36.具体而言,由于可见性是由事务的提交顺序决定的,xid不能代表事务的提交顺序,只能表示事务的起始标识,如果只有xid,却要用xid来表示事务可见性工程实现比较复杂且性能不好,在分布式场景下会放大问题,几乎处于不可用状态,具体的可见性工程实现如下:a、需要维护当前的活跃事务的xid链表,有多少个活跃事务,就有多少个元素。xid链表的读取和修改,都需要在全局锁保护下。37.b、读事务启动的时候需要拿到当前的活跃事务的xid链表。38.c、分布式事务的协调者需用统筹各个分布式节点的活跃xid链表信息。需要知道每个xid代表的分布式事务在各个节点上的执行状态:未启动,执行中,提交,回滚等。39.基于此,本发明通过系统化、结构化的改造,让如mysql这种传统的单机数据库具有更强大、更内聚的分布式能力,相比于mysql原生的事务系统,主要区别如下:1、引入transactiontable(事务表),用于持久化事务状态。在事务启动的时候,会在transactiontable分配一个transactionslot(事务槽),在事务提交的时候,会将事务状态信息回填到transactionslot上。40.作为一示例,事务状态信息可以包括xid、trxid(本地事务的唯一标识,在事务开始的时候分配的全局唯一递增号)、state(事务的状态,如:启动、提交、回滚、清理等)、tcn(transactioncommitnumber,本地事务提交号)、gcn(globalcommitnumber,全局事务提交号)等。41.2、引入本地事务提交号tcn、全局事务提交号gcn,来表示本地、全局事务的提交顺序。42.3、数据记录在格式上除了trxid以及rollptr(回滚段指针,存在于每一个innodb数据行上,通过回滚段指针,能够回溯该数据行的最近的一个历史版本)两个系统字段外,还额外引入系统字段:gcn、tcn以及tsa(transactionslotaddress,事务槽地址),tsa字段上记录了修改本记录的事务所对应的transactionslot的地址。43.其中,数据记录可以为记录(record)、数据行、行记录等,都可以看做是同一个概念,即表示一行数据在物理上的实际存储内容,当用户插入一行数据,就会在数据库上持久化一条数据记录。44.4、丢弃掉readview上用trxid来做可见性判断的机制,而采用tcn、gcn做可见性判断的机制。45.对于可见性判断,可以通过如下例子理解:有两个事务先后发生了:trx_a以及trx_b时间线为:读事务r1‑‑》写事务trx_a提交‑‑》读事务r2‑‑》写事务trx_b提交‑‑》读事务r3。46.显然:读事务r1不能看到trx_a和trx_b的修改,原因在于这个时候trx_a和trx_b都还没有提交,r2可以看到trx_a的修改,但不能看到trx_b的修改,r3可以看到trx_a和trx_b的修改。47.所以,一个视图能否看到某个事务的修改:关键在于视图建立时,该事务是否已经提交。48.对于用trxid来做可见性判断的机制,可以通过如下例子理解:在t1时刻,有两个活跃事务trxa,trxb。它们的trxid分别是50,100。同时,事务系统中还维护两个边界:30和110。所有trxid《30的事务都已经提交,而trxid》110的事务都未提交。49.在t2时刻,读事务r1启动,构建了它的视图readview。该视图实际上代表本时刻数据库的状态。即“trxid为50,100的事务处于活跃状态,而trxid《30的事务都已经提交,而trxid》110的事务都未提交”。50.当读事务r1扫描到行记录rec_1,发现修改rec_1的事务的trxid的是15,则该行记录对于r1是可见的。当读事务发现修改rec_1的事务的trxid是120,则该行记录不可见。当读事务发现修改rec_1的事务的trxid是75,通过查询r1视图的活跃事务链表信息,发现trxid为75的事务不在活跃事务范围内。则判断该行记录可见。当读事务发现修改rec_1的事务的trxid是50,通过查询r1视图的活跃事务链表信息,发现trxid为50的事务在活跃事务范围内。则判断该行记录不可见。51.对于用trxid来做可见性判断的机制存在以下问题:a、写事务和写事务、读事务和读事务,以及读事务和写事务之间都因为一把全局的事务系统大锁,而造成了相互干扰。特别是读写混合场景,写事务较多会导致activetrxset比较大,在构造readview的时候需要持有锁更长的时间,来拷贝activetrxset,从而造成了更严重的锁争抢问题。而mysqlmvcc机制设计的初衷是:读操作只读取历史版本,不会与写操作相互阻塞。但是因为这把全局大锁的原因,读写干扰难以避免。52.b、由于真实业务场景中,大部分写事务都是小事务,先进入activetrxset的一般也会先出来。但是activetrxset的数据结构是数组,移走前面的元素,需要把后面的元素全部往前挪,整个过程都需持有全局事务系统大锁,进一步加剧了问题的严重程度。53.c复杂的数据结构以及复杂的工程实现,使得mysql无法充分利用单机的多核能力。而在分布式场景下,分布式一致性查询,需要共享一个全局的readview。如果readview本身的设计就很复杂,那么各个分布式节点之间需要保持一致性就会变得更加复杂和困难。54.而对于采用tcn、gcn做可见性判断的机制,可以通过如下例子理解:在t1时刻,事务系统维护了全局事务提交号200。55.在t2时刻,读事务r1启动,构建了它的视图vision。认为所有事务提交号小于或等于200的事务都已经提交,而大于200的事务仍未提交。56.当读事务r1扫描到行记录rec_1,发现修改rec_1的事务的tcn是150。通过和vision上记录的视图信息(200)比较,发现r1启动时,修改rec_1的事务已经提交,则可判断该行记录可见。当读事务r1扫描到行记录rec_1,发现修改rec_1的事务的tcn是250。通过和vision上记录的视图信息(200)比较,发现r1启动时,修改rec_1的事务仍未提交,则可判断该行记录不可见。57.5、原生支持nativeflashbackquery(数据库领域中一种特殊的查询,它可以指定过往的某个时间点,查找该时间点时的数据库数据),用户可以通过select*fromasof[timestamp|scn]任意查询过往的历史版本。[0058]6.引入undo(数据库数据的历史版本保存在undo当中,通过undo,用户可以查询到数据过往的版本,也可以让数据回滚到某个历史版本)reservation机制。允许mysql能够从时间和空间两个维度上,控制purge系统推进的程度,让数据的历史版本得以保留。[0059]以下进行详细说明:参照图1,示出了本发明一实施例提供的一种sql数据库中分布式事务的处理的步骤流程图,sql数据库可以为mysql数据库,sql数据库可以包括多个数据库节点,如多个mysql实例。[0060]具体的,可以包括如下步骤:步骤101,在至少两个数据库节点发起分布式事务。[0061]在xa事务的基础上,可以在多个数据库中至少两个数据库节点中发起分布式事务,即同一个事务在该至少两个数据库节点中执行。[0062]步骤102,针对至少两个数据库节点中每个数据库节点,在分布式事务提交成功时,确定并持久化分布式事务的全局事务提交号,分布式事务的全局事务提交号为按照在所有分布式事务中提交成功的顺序确定的。[0063]如前文所述,事务的可见性取决于事务提交成功的顺序,而xid是xa事务启动时分配的唯一标识,其和提交顺序没有关系,则本发明实施例可以在当前的分布式事务提交成功时,按照当前的分布式事务在所有分布式事务中提交成功的顺序,确定当前的分布式事务的全局事务提交号gcn,并可以将该全局事务提交号进行持久化存储。[0064]具体而言,可以通过以下两种方法在提交成功的时候指定外部的全局事务提交号gcn:1、setsessioninnodb_commit_seq=[gcn];xacommitxid2、xacommitxid$gcn在本发明一实施例中,分布式事务的全局事务提交号可以为单调递增的时序值,可以通过服务组件tso(timestamporacle)方案来保证分布式事务的时序。即存在一个服务组件tso,tso授时服务可以保证按照递增的方式分配时间戳,任何一次申请得到的时间戳都不会重复,在分布式系统中用于给事件定序,最常见和重要的作用即保证事务版本号的单调递增,确保分布式事务的时序,不断产生递增的单调时序值,该值将会作为全局的分布式事务提交gcn持久化到各个mysql节点中。[0065]步骤103,响应于针对sql数据库的一致性查询,在当前构建的一致性视图的基础上,根据扫描的数据记录对应的目标分布式事务的全局事务提交号,确定数据记录的可见性判断结果。[0066]其中,一致性视图可以为数据库的状态(包括数据、数据与数据之间的关系),数据库的状态会随着用户的操作而发生改变,在读事务发生时,需要拿到一个视图,来表示读事务观察到的当时的数据库的状态,一致性视图是通过一个全局事务提交号来表示(即:视图起来的时候,从全局事务提交号中拿当时的事务提交号构成自己)。[0067]由于全局事务提交号可以表征分布式事务提交成功的顺序,且在事务提交成功时进行了持久化,则在进行全局一致性查询时,在扫描到某个数据记录时,可以查询该数据记录对应的目标分布式事务的全局事务提交号,进而可以根据目标分布式事务的全局事务提交号,判断该数据记录是否可见,得到在当前构建的一致性视图下的可见性判断结果。[0068]在本发明一实施例中,当前构建的一致性视图可以对应有一第一全局事务提交号,根据扫描的数据记录对应的目标分布式事务的全局事务提交号,确定数据记录的可见性判断结果,可以包括:在目标分布式事务的全局事务提交号小于或等于第一全局事务提交号的情况下,判定数据记录为可见状态;在目标分布式事务的全局事务提交号大于第一全局事务提交号的情况下,判定数据记录为不可见状态。[0069]在具体实现中,可以在mysql节点上都采用flashbackquery的方式,即:用户可以任意指定gcn,查询所有全局事务提交号小于或等于该gcn的分布式事务带来的修改(需要说明的是,在数据记录存在多个历史版本的情况下,如undo链中存在gcn分别为200、100、80的分布式事务对应的历史版本,则当输入的全局事务提交号为gcn=120,则只会看到gcn为100的分布式事务对应的历史版本,而不是gcn为80的分布式事务对应的历史版本,即在数据记录存在多个历史版本的情况下,查询全局事务提交号小于或等于指定的gcn对应的最近一个历史版本),其提供了两种使用方式:1、setsessioninnodb_snapshot_seq=[gcn]2、select...fromtablenameasofgcn其中,方式1可以通过改变innodb_snapshot_seq这个会话级的变量,来指定分布式一致性查询所需要的gcn,方式2可以通过扩展的sql(社区mysql版本没有这样的语法)来指定分布式一致性查询所需要的gcn。[0070]基于此,一致性查询可以对应有一第一全局事务提交号,即指定的gcn,在判断数据记录是否可见时,可以判断数据记录对应的分布式事务的全局事务提交号是否小于或等于第一全局事务提交号的情况下,可以判定该数据记录为可见状态,在目标分布式事务的全局事务提交号大于第一全局事务提交号的情况下,可以判定该数据记录为不可见状态。[0071]在本发明实施例中,通过在至少两个数据库节点发起分布式事务,然后针对至少两个数据库节点中每个数据库节点,在分布式事务提交成功时,确定并持久化分布式事务的全局事务提交号,响应于针对sql数据库的一致性查询,在当前构建的一致性视图的基础上,根据扫描的数据记录对应的目标分布式事务的全局事务提交号,确定数据记录的可见性判断结果,实现了对sql数据库中分布式一致性查询的优化,能够根据分布式事务的提交顺序来进行可见性判断,保证了一致性查询的准确性、高效性。[0072]参照图2,示出了本发明一实施例提供的另一种sql数据库中分布式事务的处理的步骤流程图,具体可以包括如下步骤:步骤201,在至少两个数据库节点发起分布式事务。[0073]步骤202,针对至少两个数据库节点中每个数据库节点,在分布式事务提交过程中,持久化分布式事务的事务状态,并在分布式事务提交成功时,确定并持久化分布式事务的全局事务提交号,分布式事务的全局事务提交号为按照在所有分布式事务中提交成功的顺序确定的。[0074]其中,分布式事务可以为基于两阶段提交(2pc,two-phasecommit)协议进行提交,事务状态可以与分布式事务在两阶段提交协议中所处的阶段相对应,其可以包括未提交成功状态和提交成功状态,未提交成功状态即可以为2pc的第一阶段中的prepared状态。需要说明的是,未提交成功的事务状态有多种,如active状态表示事务处于活跃状态。这样的事务带来的修改,只有本事务才可见。也就是说,自己的修改,自己必须能看见。否则,其它视图对于这样的都是不可见的。另外还有一阶段的状态,也就是说所谓的prepare状态,只有遇到这样的状态,才需要等待这个事务提交掉。[0075]具体的,mysql在xa事务中采用2pc来保证事务的一致性,具体的,分布式系统中存在两种角色,一种是协调者,一种是参与者。[0076]事务提交的时候有两个阶段:第一阶段(也被称为prepare阶段):1、协调者节点向所有参与者节点询问是否可以执行提交操作,并开始等待各参与者节点的响应。[0077]2、参与者节点执行完所有的操作后,将修改持久化掉。[0078]3、参与者节点根据具体情况,响应协调者是"同意"还是"中止"。[0079]第二阶段:1、协调者根据各个节点反馈,决定分布式事务是提交还是回滚。然后将这个决议下发给所有的节点。[0080]2、各个节点根据协调者的指令,对本事务进行提交或回滚操作。完成后向协调者反馈。[0081]3.、协调者收到所有节点的反馈后,最终该事务进入完结状态(提交或回滚)。[0082]在本发明实施例中,一个xa事务在数据库节点上执行的过程如下:1、xastart$xid:开启一个事务,并将事务置于active状态,同时分配一个transactionslot。[0083]2、xaend$xid:将事务置于idle状态,表示事务内的sql操作完成。[0084]3、xaprepare$xid:2pc的第一个阶段,事务状态置于prepared状态,prepared状态表示事务已经完成2pc的第一个阶段。[0085]4、xacommit$xid:2pc的第二个阶段,从tso获取gcn并持久化,事务最终提交。[0086]从上述过程可知,如果分布式一致性查询发现当前查询的行记录,所对应的事务处于prepared状态,该事务虽然处于提交的过程中,但事实上在这个节点上并没有完成提交,无法查询其对应的全局事务提交号(在2pc的第二阶段提交成功才确定gcn),则读视图无法判断出该记录是否可见。[0087]具体而言,如果认为该事务仍处于活跃状态,则判断为不可见,但这个分布式事务可能在别分布式节点上已经提交,并被查询出结果。这样会导致同一个查询在一个节点上能查询到结果,而在另外的节点上查询不到结果。如果认为该事务处于完结状态,而事实上该事务需要在2pc的第二个阶段才能获知本事务的外部提交号gcn。[0088]基于上述分析,可以得出结论:处于prepared状态的事务是无法进行可见性判断,需要进行进一步操作,不能直接进行可见性判断,则可以在分布式事务采用2pc进行提交过程中,根据其在两阶段提交协议中所处的阶段确定事务状态,进而可以对事务状态进行持久化。[0089]步骤203,响应于针对sql数据库的一致性查询,查询扫描的数据记录对应的目标分布式事务的事务状态;在进行全局的一致性查询时,由于对事务状态进行了持久化,则可以查询扫描的数据记录对应的目标分布式事务的事务状态。[0090]步骤204,在目标分布式事务的事务状态为提交成功状态时,查询目标分布式事务的全局事务提交号;在目标分布式事务的事务状态为提交成功状态时,即其已完成2pc中的第二阶段,则可以直接查询目标分布式事务的全局事务提交号。[0091]步骤205,在目标分布式事务的事务状态为未提交成功状态时,控制一致性查询进入等待状态,直至目标分布式事务的事务状态更新为提交成功状态时,查询目标分布式事务的全局事务提交号;在目标分布式事务的事务状态为未提交成功状态时,即处于2pc中的第一阶段,即处于prepared状态,则可以应用gp(globalquery)wait机制,在事务锁的基础上,构建出gplock来表示阻塞关系,使得一致性查询进入等待状态,直到该prepare状态的事务完成2pc的第二阶段,即分布式事务提交成功,事务状态更新为提交成功状态,则可以查询目标分布式事务的全局事务提交号。[0092]步骤206,在当前构建的一致性视图的基础上,根据扫描的数据记录对应的目标分布式事务的全局事务提交号,确定数据记录的可见性判断结果。[0093]以下结合2pc来说明数据记录的可见性判断:假设。现在有两个分布式事务dt_a(包括dt_a1、dt_a2)、dt_b(包括dt_b1、dt_b2),它们的提交号分别是50和100。在某个时刻t1,tso上的gcn生成器已经推高到110,而上面两个分布式事务在两个分布式节点上的状态分别是:node1:dt_a1(已提交,gcn=50),dt_b1(已提交,gcn=100)node2:dt_b2(已提交,gcn=100),dt_a2(prepared)。[0094]这个时候一个全局的一致性查询q1发起,拿到的全局视图r1的第一全局事务提交号gcn=110。[0095]在node1上,根据以gcn为核心的可见性判断机制。dt_a1与dt_b1的修改都被判断为可见。[0096]而在node2上,对于dt_b2的修改,r1可以判断为可见(110》100)。但是对于dt_a2带来的修改,假设这些修改作用于行记录rec_1上,则:1、r1是没有办法知道这个修改是由dt_a这个分布式事务带来的,并且这个事务在全局视图下认为已经被提交了。[0097]2、在r1看来,这个事务处于prepared状态,即不是活跃状态(可以直接判定为不可见),也不是事务的终态(即提交)。所以这个时候必须要陷入gpwait状态,等待这个事务最终提交。当dt_a2完成提交过程后,r1才能够知道dt_a2的全局事务提交号gcn(gcn=50)。此时,才能够判断为该事务带来的修改,对于r1来说是可见的。[0098]在本发明一实施例中,数据记录可以存储有用于指向目标分布式事务对应的事务槽的事务槽地址(tsa),还可以包括:在分布式事务启动时,在预置的事务表中分配分布式事务对应的事务槽,事务槽用于持久化分布式事务的全局事务提交号和分布式事务的事务状态。[0099]在具体实现,可以通过xastart$xid开启一个事务,并将事务置于active状态,同时分配一个transactionslot,后续的分布式事务的全局事务提交号和分布式事务的事务状态都将存储在该transactionslot中。[0100]在一示例中,本地事务提交号(tcn)也可以持久化至该transactionslot中,本地事务提交号可以由数据库节点中的tcn生成器在本地事务提交时生成,并持久化。[0101]需要说明的是,分布式事务是由多个本地事务协同完成的,事务槽是属于本地的,如分布式事务需要在两个数据节点上完成,两个数据节点都需要完成各自本地事务,然后都成功提交掉后,这个分布式事务才算提交成功。事务槽是存在每个数据节点上的。[0102]在本发明一实施例中,还可以包括:当对目标事务槽进行复用时,判断目标事务槽对应的分布式事务是否已结束,并在目标事务槽对应的分布式事务结束的情况下,允许对目标事务槽进行复用。[0103]在具体实现中,可以将分布式事务的包括tcn、gcn等信息持久化到transactiontable上。由于transactiontable不能无限膨胀,所以transactiontable引入了复用机制。然而,如果某个事务的transactionslot被复用掉,这个事务的事务状态信息将会丢失掉。[0104]为了让查询(包括全局一致性查询和本地查询)能够尽可能地找到行记录对应事务的真实的事务状态信息,可以将被复用的事务状态信息放到一个深度链表上。这意味着,gcn在这个深度链表也有一个时序。如果gcn在深度链表上是乱序的,则被查询的行记录,会获取到一个错误的事务状态信息,从而导致查询得到错误的结果集。[0105]针对这种情况,本方案通过控制transactionslot的复用机制来保证gcn在这个深度链表的有序性。transactionslot在事务启动的时候被分配,在事务完结后才允许被复用。transactionslot至少要在事务完结之后才允许被复用,所以能够保证gcn在深度链表上的有序性。[0106]在本发明一实施例中,还可以包括:在存在至少两个分布式事务修改同一个数据记录时,通过事务锁阻塞除在先进行修改的分布式事务外的其他分布式事务,直至在先进行修改的分布式事务获得全局事务提交号并提交。[0107]在具体实现中,mysql的历史版本数据都会存在undo表空间中。对于每一条行记录,它的所有历史版本都会按照先后顺序被组织成一个链表。行记录的最新版本在链表的头部,而行记录的最老记录在链表的末尾。从链表头部沿着链表走到链表的尾部,trxid、tcn是降序的。如果gcn在这个undo链上是乱序的,则可能会导致分布式一致性查询查到错误的结果,因为分布式查询在每个mysql节点上都采用flashbackquery的方式,而该方式需要不断遍历undo链表,直到找到第一个历史版本数据(最近一个历史版本数据),它的持久化gcn号比flashbackquery指定的gcn号要小。[0108]基于此,本方案通过mysql事务锁机制,能够保证gcn在undo链上有正确的先后顺query。[0118]3、保证了gcn在核心结构上的正确性以及有效性,具体如下:a、借助事务锁机制保证undo链上的gcn的有序性。[0119]b、控制transactionslot的复用机制来保证gcn在深度链表的有序性。[0120]c、引入了purged_gcn机制,解决了gcn在historylist上乱序的问题,保证查询不会错误查找到已经被清理的历史版本。[0121]4、引入了gplock机制,解决了处于prepare状态的事务的可见性问题,保证查询能够拿到正确事务状态信息。[0122]5、生成持久化的全局单调递增号,并用于tso生成全局事务提交号gcn。[0123]以下结合图3和表1进行示例性说明:如图3所示,存在两个数据库节点node1和node2,每个数据库节点存在trxid生成器和tcn生成器,trxid生成器在事务开始(begin)时生成trxid,tcn生成器在事务提交时在事务表(transactiontable)持久化trxid、tcn,数据记录的格式(recordformat)可以包括pk(primarykey,mysqlinnodb数据表的主键字段,表上的每一个数据行都有唯一的pk)、tcn、tsa、trxid、rollptr、usercols。[0124]在外部可以设置以tso组件,其携带有gcn生成器,可以在生成gcn并在事务提交时将gcn持久化至事务表。[0125]如表1所示为一分布式事务的执行过程:需要说明的是,对于方法实施例,为了简单描述,故将其都表述为一系列的动作组合,但是本领域技术人员应该知悉,本发明实施例并不受所描述的动作顺序的限制,因为依据本发明实施例,某些步骤可以采用其他顺序或者同时进行。其次,本领域技术人员也应该知悉,说明书中所描述的实施例均属于优选实施例,所涉及的动作并不一定是本发明实施例所必须的。[0126]参照图4,示出了本发明一实施例提供的一种sql数据库中分布式事务的处理装置的结构示意图,sql数据库可以包括多个数据库节点。[0127]具体的,可以包括如下模块:分布式事务发起模块401,用于在至少两个数据库节点发起分布式事务。[0128]全局事务提交号持久化模块402,用于针对至少两个数据库节点中每个数据库节点,在分布式事务提交成功时,确定并持久化分布式事务的全局事务提交号,分布式事务的全局事务提交号为按照在所有分布式事务中提交成功的顺序确定的。[0129]一致性查询模块403,用于响应于针对sql数据库的一致性查询,在当前构建的一致性视图的基础上,根据扫描的数据记录对应的目标分布式事务的全局事务提交号,确定数据记录的可见性判断结果。[0130]在本发明一实施例中,当前构建的一致性视图对应有一第一全局事务提交号,一致性查询模块403,可以包括:可见状态判定子模块,用于在目标分布式事务的全局事务提交号小于或等于第一全局事务提交号的情况下,判定数据记录为可见状态。[0131]不可见状态判定子模块,用于在目标分布式事务的全局事务提交号大于第一全局事务提交号的情况下,判定数据记录为不可见状态。[0132]在本发明一实施例中,分布式事务的全局事务提交号为单调递增的时序值。[0133]在本发明一实施例中,还可以包括:事务状态持久化模块,用于在分布式事务提交过程中,持久化分布式事务的事务状态。[0134]在本发明一实施例中,还可以包括:事务状态查询模块,用于查询扫描的数据记录对应的目标分布式事务的事务状态。[0135]第一全局事务提交查询模块,用于在目标分布式事务的事务状态为提交成功状态时,查询目标分布式事务的全局事务提交号。[0136]第二全局事务提交查询模块,用于在目标分布式事务的事务状态为未提交成功状态时,控制一致性查询进入等待状态,直至目标分布式事务的事务状态更新为提交成功状态时,查询目标分布式事务的全局事务提交号。[0137]在本发明一实施例中,分布式事务为基于两阶段提交协议进行提交,事务状态与分布式事务在两阶段提交协议中所处的阶段相对应。[0138]在本发明一实施例中,数据记录存储有用于指向目标分布式事务对应的事务槽的事务槽地址,还可以包括:分配事务槽模块,用于在分布式事务启动时,在预置的事务表中分配分布式事务对应的事务槽,事务槽用于持久化分布式事务的全局事务提交号和分布式事务的事务状态。[0139]在本发明一实施例中,还可以包括:事务槽复用模块,用于当对目标事务槽进行复用时,判断目标事务槽对应的分布式事务是否已结束,并在目标事务槽对应的分布式事务结束的情况下,允许对目标事务槽进行复用。[0140]在本发明一实施例中,还可以包括:事务锁阻塞模块,用于在存在至少两个分布式事务修改同一个数据记录时,通过事务锁阻塞除在先进行修改的分布式事务外的其他分布式事务,直至在先进行修改的分布式事务获得全局事务提交号并提交。[0141]在本发明一实施例中,还可以包括:第二全局事务提交号确定模块,用于在对数据记录的历史版本进行清理时,确定第二全局事务提交号。[0142]当前历史版本清理模块,用于在当前历史版本对应的分布式事务的全局事务提交号小于第二全局事务提交号的情况下,对当前历史版本进行清理。[0143]第二全局事务提交号增大模块,用于在当前历史版本对应的分布式事务的全局事务提交号大于第二全局事务提交号的情况下,对第二全局事务提交号进行增大。[0144]参照图5,示出了本发明一实施例提供的一种sql数据库中分布式事务的处理系统的结构示意图,sql数据库可以包括多个数据库节点,处理系统可以包括服务组件501和处理模块502。[0145]服务组件501,用于在sql数据库中分布式事务提交成功时,生成分布式事务的全局事务提交号。[0146]处理模块502,用于在sql数据库中至少两个数据库节点发起分布式事务的情况下,针对至少两个数据库节点中每个数据库节点,在分布式事务提交成功时,确定并持久化分布式事务的全局事务提交号;响应于针对sql数据库的一致性查询,在当前构建的一致性视图的基础上,根据扫描的数据记录对应的目标分布式事务的全局事务提交号,确定数据记录的可见性判断结果;其中,分布式事务的全局事务提交号为按照在所有分布式事务中提交成功的顺序确定的。[0147]在本发明一实施例中,当前构建的一致性视图对应有一第一全局事务提交号,根据扫描的数据记录对应的目标分布式事务的全局事务提交号,确定数据记录的可见性判断结果,可以包括:在目标分布式事务的全局事务提交号小于或等于第一全局事务提交号的情况下,判定数据记录为可见状态。[0148]在目标分布式事务的全局事务提交号大于第一全局事务提交号的情况下,判定数据记录为不可见状态。[0149]在本发明一实施例中,分布式事务的全局事务提交号为单调递增的时序值。[0150]在本发明一实施例中,处理模块502还可以用于:在分布式事务提交过程中,持久化分布式事务的事务状态。[0151]在本发明一实施例中,处理模块502还可以用于:查询扫描的数据记录对应的目标分布式事务的事务状态。[0152]在目标分布式事务的事务状态为提交成功状态时,查询目标分布式事务的全局事务提交号。[0153]在目标分布式事务的事务状态为未提交成功状态时,控制一致性查询进入等待状态,直至目标分布式事务的事务状态更新为提交成功状态时,查询目标分布式事务的全局事务提交号。[0154]在本发明一实施例中,分布式事务为基于两阶段提交协议进行提交,事务状态与分布式事务在两阶段提交协议中所处的阶段相对应。[0155]在本发明一实施例中,数据记录存储有用于指向目标分布式事务对应的事务槽的事务槽地址,处理模块502还可以用于:在分布式事务启动时,在预置的事务表中分配分布式事务对应的事务槽,事务槽用于持久化分布式事务的全局事务提交号和分布式事务的事务状态。[0156]在本发明一实施例中,处理模块502还可以用于:当对目标事务槽进行复用时,判断目标事务槽对应的分布式事务是否已结束,并在目标事务槽对应的分布式事务结束的情况下,允许对目标事务槽进行复用。[0157]在本发明一实施例中,处理模块502还可以用于:在存在至少两个分布式事务修改同一个数据记录时,通过事务锁阻塞除在先进行修改的分布式事务外的其他分布式事务,直至在先进行修改的分布式事务获得全局事务提交号并提交。[0158]在本发明一实施例中,处理模块502还可以用于:在对数据记录的历史版本进行清理时,确定第二全局事务提交号。[0159]在当前历史版本对应的分布式事务的全局事务提交号小于或等于第二全局事务提交号的情况下,对当前历史版本进行清理。[0160]在当前历史版本对应的分布式事务的全局事务提交号大于第二全局事务提交号的情况下,对第二全局事务提交号进行增大。[0161]本发明一实施例还提供了一种电子设备,可以包括处理器、存储器及存储在存储器上并能够在处理器上运行的计算机程序,计算机程序被处理器执行时实现如上sql数据库中分布式事务的处理方法。[0162]本发明一实施例还提供了一种计算机可读存储介质,计算机可读存储介质上存储计算机程序,计算机程序被处理器执行时实现如上sql数据库中分布式事务的处理方法。[0163]对于装置实施例而言,由于其与方法实施例基本相似,所以描述的比较简单,相关之处参见方法实施例的部分说明即可。[0164]本说明书中的各个实施例均采用递进的方式描述,每个实施例重点说明的都是与其他实施例的不同之处,各个实施例之间相同相似的部分互相参见即可。[0165]本领域内的技术人员应明白,本发明实施例可提供为方法、装置、或计算机程序产品。因此,本发明实施例可采用完全硬件实施例、完全软件实施例、或结合软件和硬件方面的实施例的形式。而且,本发明实施例可采用在一个或多个其中包含有计算机可用程序代码的计算机可用存储介质(包括但不限于磁盘存储器、cd-rom、光学存储器等)上实施的计算机程序产品的形式。[0166]本发明实施例是参照根据本发明实施例的方法、终端设备(系统)、和计算机程序产品的流程图和/或方框图来描述的。应理解可由计算机程序指令实现流程图和/或方框图中的每一流程和/或方框、以及流程图和/或方框图中的流程和/或方框的结合。可提供这些计算机程序指令到通用计算机、专用计算机、嵌入式处理机或其他可编程数据处理终端设备的处理器以产生一个机器,使得通过计算机或其他可编程数据处理终端设备的处理器执行的指令产生用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的装置。[0167]这些计算机程序指令也可存储在能引导计算机或其他可编程数据处理终端设备以特定方式工作的计算机可读存储器中,使得存储在该计算机可读存储器中的指令产生包括指令装置的制造品,该指令装置实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能。[0168]这些计算机程序指令也可装载到计算机或其他可编程数据处理终端设备上,使得在计算机或其他可编程终端设备上执行一系列操作步骤以产生计算机实现的处理,从而在计算机或其他可编程终端设备上执行的指令提供用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的步骤。[0169]尽管已描述了本发明实施例的优选实施例,但本领域内的技术人员一旦得知了基本创造性概念,则可对这些实施例做出另外的变更和修改。所以,所附权利要求意欲解释为包括优选实施例以及落入本发明实施例范围的所有变更和修改。[0170]最后,还需要说明的是,在本文中,诸如第一和第二等之类的关系术语仅仅用来将一个实体或者操作与另一个实体或操作区分开来,而不一定要求或者暗示这些实体或操作之间存在任何这种实际的关系或者顺序。而且,术语“包括”、“包含”或者其任何其他变体意在涵盖非排他性的包含,从而使得包括一系列要素的过程、方法、物品或者终端设备不仅包括那些要素,而且还包括没有明确列出的其他要素,或者是还包括为这种过程、方法、物品或者终端设备所固有的要素。在没有更多限制的情况下,由语句“包括一个……”限定的要素,并不排除在包括所述要素的过程、方法、物品或者终端设备中还存在另外的相同要素。[0171]以上对所提供的sql数据库中分布式事务的处理方法、装置及系统,进行了详细介绍,本文中应用了具体个例对本发明的原理及实施方式进行了阐述,以上实施例的说明只是用于帮助理解本发明的方法及其核心思想;同时,对于本领域的一般技术人员,依据本发明的思想,在具体实施方式及应用范围上均会有改变之处,综上所述,本说明书内容不应理解为对本发明的限制。当前第1页12当前第1页12
再多了解一些

本文用于企业家、创业者技术爱好者查询,结果仅供参考。

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表

相关文献