一种分布式数据库事务原子性实现方法及装置与流程

文档序号:24405990发布日期:2021-03-26 17:08阅读:148来源:国知局
一种分布式数据库事务原子性实现方法及装置与流程

1.本申请实施例涉及计算机技术领域,尤其涉及一种分布式数据库事务原子性实现方法及装置。


背景技术:

2.nosql(not only sql)数据库是对不同于传统的关系数据库的数据库管理系统的统称,nosql数据库不通过sql来操作数据,而是通过get/set/delete等少数特定的接口来操作数据。对于分布式nosql数据库,数据被分散存储在不同的物理节点中,一个数据库事务往往需要操作不同的物理节点。如果没有原子性保证,那么一个数据库事务的多个操作全部执行完毕后,可能出现针对某个物理节点的操作成功而针对另一个物理节点的操作失败的情况,从而导致业务逻辑的完整性被破坏。
3.传统的分布式事务实现方法一般通过集中式事务管理器和锁机制来实现。事务的所有操作均发送给事务管理器,由事务管理器来执行,同时,通过对资源的排它性锁来避免其它事务对某个事务所操作的资源的使用。
4.因为所有的事务操作都必须通过集中式事务管理器,在锁机制的排他性影响下,增加了其它想要操作共同资源的事务的等待时间,导致系统的整体吞吐量较低。


技术实现要素:

5.本申请实施例提供一种分布式数据库事务原子性实现方法及装置,以减少事务的等待时间,提高系统的整体吞吐量。
6.在第一方面,本申请实施例提供了一种分布式数据库事务原子性实现方法,包括:
7.响应于写操作指令创建事务对象,并确定所述事务对象的事务标识;
8.确定所述事务对象指向的数据对象的数据版本号和数据值;
9.基于比较交换操作,通过所述事务标识将所述事务对象与每个所述数据对象进行关联,并依据写操作指令对关联的所述数据对象执行相应的数据操作,以将执行数据操作后的数据值赋值给所述数据对象的期望值,并确定更新后的数据版本号;
10.基于所述事务对象的事务状态以及所述数据版本号的同步状态,根据所述数据对象的期望值对数据值进行修改,并更新所述数据版本号。
11.在第二方面,本申请实施例提供了一种分布式数据库事务原子性实现装置,包括事务创建模块、数据获取模块、数据操作模块和修改执行模块,其中:
12.事务创建模块,用于响应于写操作指令创建事务对象,并确定所述事务对象的事务标识;
13.数据获取模块,用于确定所述事务对象指向的数据对象的数据版本号和数据值;
14.数据操作模块,用于基于比较交换操作,通过所述事务标识将所述事务对象与每个所述数据对象进行关联,并依据写操作指令对关联的所述数据对象执行相应的数据操作,以将执行数据操作后的数据值赋值给所述数据对象的期望值,并确定更新后的数据版
本号;
15.修改执行模块,用于基于所述事务对象的事务状态以及所述数据版本号的同步状态,根据所述数据对象的期望值对数据值进行修改,并更新所述数据版本号。
16.在第三方面,本申请实施例提供了一种计算机设备,包括:存储器以及一个或多个处理器;
17.所述存储器,用于存储一个或多个程序;
18.当所述一个或多个程序被所述一个或多个处理器执行,使得所述一个或多个处理器实现如第一方面所述的分布式数据库事务原子性实现方法。
19.在第四方面,本申请实施例提供了一种包含计算机可执行指令的存储介质,所述计算机可执行指令在由计算机处理器执行时用于执行如第一方面所述的分布式数据库事务原子性实现方法。
20.本申请实施例通过创建事务对象,并确定事务对象指向的数据对象的数据版本号和数据值,基于比较交换操作,通过事务标识将事务对象和数据对象进行关联,并依据写操作指令对数据对象执行数据操作,从而将执行数据操作后的数据值赋值给数据对象的期望值,并更新数据版本号,在事务对象成功提交并且数据版本号未被其他进程修改时,将数据对象的数据值修改为期望值,并更新数据版本号,完成对数据对象的写操作,将事务管理器的功能放在客户端,借助分布式nosql数据库系统的无锁比较交换操作,实现分布式数据库事务的原子性,有效提高事务的并发量,减少事务执行等待时间,提高了分布式nosql数据库事务的吞吐量。
附图说明
21.图1是本申请实施例提供的一种分布式数据库事务原子性实现方法的流程图;
22.图2是本申请实施例提供的另一种分布式数据库事务原子性实现方法的流程图;
23.图3是本申请实施例提供的一种事务对象的事务状态变化示意图;
24.图4是本申请实施例提供的一种对事务对象的清理操作的流程图;
25.图5是本申请实施例提供的一种转账事务的流程图;
26.图6是本申请实施例提供的一种转账事务中存储节点和客户端的关系示意图;
27.图7是本申请实施例提供的一种分布式数据库事务原子性实现装置的结构示意图;
28.图8是本申请实施例提供的一种计算机设备的结构示意图。
具体实施方式
29.为了使本申请的目的、技术方案和优点更加清楚,下面结合附图对本申请具体实施例作进一步的详细描述。可以理解的是,此处所描述的具体实施例仅仅用于解释本申请,而非对本申请的限定。另外还需要说明的是,为了便于描述,附图中仅示出了与本申请相关的部分而非全部内容。在更加详细地讨论示例性实施例之前应当提到的是,一些示例性实施例被描述成作为流程图描绘的处理或方法。虽然流程图将各项操作(或步骤)描述成顺序的处理,但是其中的许多操作可以被并行地、并发地或者同时实施。此外,各项操作的顺序可以被重新安排。当其操作完成时所述处理可以被终止,但是还可以具有未包括在附图中
的附加步骤。所述处理可以对应于方法、函数、规程、子例程、子程序等等。
30.图1给出了本申请实施例提供的一种分布式数据库事务原子性实现方法的流程图,本申请实施例提供的分布式数据库事务原子性实现方法可以由分布式数据库事务原子性实现装置来执行,该分布式数据库事务原子性实现装置可以通过硬件和/或软件的方式实现,并集成在计算机设备中。
31.下述以分布式数据库事务原子性实现装置执行分布式数据库事务原子性实现方法为例进行描述。参考图1,该分布式数据库事务原子性实现方法包括:
32.s101:响应于写操作指令创建事务对象,并确定所述事务对象的事务标识。
33.其中,在本实施例提供的分布式数据库系统中,包含有多个存储节点,这些存储节点中保存有多个数据对象。本实施例提供的事务由外部操作输入进行触发,外部输入根据事务所涉及的数据对象以及需要对数据对象进行的数据操作,向客户端发出写操作指令。
34.示例性的,在接收到写操作指令时,响应于该写操作指令创建事务对象,并确定该事务对象的事务标识,根据该事务标识可定位到其所指向的具体事务对象。
35.s102:确定所述事务对象指向的数据对象的数据版本号和数据值。
36.本实施例提供的数据对象记录有数据版本号、数据值、期望值、关联事务标识等属性,其中,数据版本号用于表示当前数据值的版本号(version,数据版本号在每次比较交换操作的更新操作中都会增加),数据值为业务可见的值(value),期望值(expected_value)为事务操作将修改的新的数据值,关联事务标识(xid)用于指向数据对象所关联的事务对象,空值(null)表示未关联数据对象。不同于原始的key=value这样的数据模型,本实施例将数据对象设置为key=value_object这样的模型,业务可见的数据值(value)被放在数据对象(value_object)当中。
37.示例性的,在创建事务对象后,确定该事务对象指向的数据对象,并向数据对象对应的存储节点获取数据对象的数据版本号和数据值。
38.例如,假设一个资金账户对应的数据对象a在被更新了12次后,其数据值(资金余额)在最近一次的事务中被更新为500,那么在事务开始前数据对象a的存储数据为:a={version:12,value:500,expected_value:null,xid:null}。那么在创建事务对象后,获取到该数据对象的数据版本号为12,数据值为500。可通过指令:version,value:=node.read("a"),得到数据对象a的数据版本号version和数据值value。
39.s103:基于比较交换操作,通过所述事务标识将所述事务对象与每个所述数据对象进行关联,并依据写操作指令对关联的所述数据对象执行相应的数据操作,以将执行数据操作后的数据值赋值给所述数据对象的期望值,并确定更新后的数据版本号。
40.其中,比较交换操作(cas,compareand swap)是指在更新数据前,比较即将被更新的数据,如果与预期相同则进行更新,否则不进行更新,比较和更新共同组成一个无法被分割的原子操作。
41.示例性的,基于比较交换操作,将事务对象的事务标识赋值到该事务对象指向的每个数据对象中,以将该事务对象与对应数据对象进行关联。具体的,将事务标识赋值到对应数据对象的关联事务标识中,在读取对应数据对象时,根据数据对象中的关联事务标识即可得知该数据对象是否有关联事务对象以及关联的具体事务对象。
42.进一步的,依据写操作指令对从各数据对象获取到的数据值进行相应的数据操
作,并分别将对数据值执行数据操作得到的处理结果赋值给对应数据对象的期望值。在确定数据对象的期望值后,对数据版本号进行更新,即对数据版本号进行加一操作。在其他事务对象需要对该数据对象进行写操作时,若其先前获取的数据版本号为未更新的数据版本号,那么对应落后的数据版本号的事务对象将会被删除并终止对应事务。可以理解的是,本实施例将执行数据操作后的数据值赋值给数据对象的期望值时,只对数据对象的期望值进行了修改,并未修改数据对象的数据值。
43.例如,假设在创建事务对象时随机生成的事务标识为a1,写操作指令指示对上述数据对象a的数据操作为资金余额减少100,那么对应期望值被赋值为:expected_value=value

100,此时期望值记录的数值为500

100=400,并将数据对象a的数据版本号更新为13,那么此时数据对象a的存储数据为:a={version:13,value:500,expected_value:400,xid:a1}。
44.s104:基于所述事务对象的事务状态以及所述数据版本号的同步状态,根据所述数据对象的期望值对数据值进行修改,并更新所述数据版本号。
45.示例性的,在完成对事务对象和数据对象的关联、期望值以及数据版本号的更新后,提交该事务对象,根据提交事务对象的返回值确定该事务对象的事务状态。
46.在事务对象的事务状态指示事务提交成功时,即事务对象的事务状态为事务完成状态时,进一步确定数据版本号的同步状态,即判断在设置期待值后更新并确定的数据版本号是否与该数据对象当前(实时)的数据版本号一致,若一致,则数据版本号处于同步状态;若在期间由其他事务更新了数据对象,此时会出现数据版本号与当前数据版本号不一致的情况,数据版本号处于非同步状态。在事务提交不成功时,可对数据对象进行回滚操作,在数据版本号不一致时,返回错误指示信息,提示数据对象已被其他事务修改。
47.需要进行解释的是,在一次正常的写操作流程中,数据对象的数据版本号会发生两次更新,第一次是在步骤s103中进行,第二次是在步骤s104中对数据值进行修改后进行。在步骤s103中确定更新后的数据版本号时,会对这次更新的版本号进行记录。在事务对象处于事务完成状态时,若记录的数据版本号与数据对象当前的数据版本号一致,此时为数据版本号的同步状态;若中间有其他事务修改了数据对象,则记录的数据版本号与数据对象当前的数据版本号不一致,此时为数据版本号的不同步状态。进一步的,对数据对象的任何修改操作均会更新数据对象的数据版本号。
48.在事务对象处于事务完成状态以及数据版本号处于同步状态时,将对应数据对象的数据值修改为期望值后清空期望值,即将期望值赋值给数据值,然后将期望值清空,同时对数据版本号进行更新,并解除事务对象和数据对象的关联。
49.例如,在提交上述事务对象后返回的事务状态指示事务对象处于事务完成状态,并且数据对象当前数据版本号也为13,此时可确定数据版本号处于同步状态,那么根据数据对象的期望值对数据值进行修改,并更新数据版本号后,数据对象a的存储数据为:a={version:14,value:400,expected_value:null,xid:null}。
50.上述,通过创建事务对象,并确定事务对象指向的数据对象的数据版本号和数据值,基于比较交换操作,通过事务标识将事务对象和数据对象进行关联,并依据写操作指令对数据对象执行数据操作,从而将执行数据操作后的数据值赋值给数据对象的期望值,并更新数据版本号,在事务对象成功提交并且数据版本号未被其他进程修改时,将数据对象
的数据值修改为期望值,并更新数据版本号,完成对数据对象的写操作,将事务管理器的功能放在客户端,借助分布式nosql数据库系统的无锁比较交换操作,实现分布式数据库事务的原子性,有效提高事务的并发量,减少事务执行等待时间,提高了分布式nosql数据库事务的吞吐量。
51.在上述实施例的基础上,图2给出了本申请实施例提供的另一种分布式数据库事务原子性实现方法的流程图,该分布式数据库事务原子性实现方法是对上述分布式数据库事务原子性实现方法的具体化。如图2所示,该分布式数据库事务原子性实现方法包括:
52.s201:响应于写操作指令创建事务对象,并确定所述事务对象的事务标识和事务版本号。
53.本实施例提供的事务对象记录有事务版本号、事务时间戳和事务状态码,其中,事务版本号用于表示当前事务对象的版本号,其应用于比较交换操作中,事务时间戳用于记录事务对象创建的时间,事务状态码用于表示当前事务对象的事务状态,本实施例提供的事务状态包括事务等待状态、事务终止状态和事务完成状态。可选的,上述不同的事务状态对应的事务状态码的值分别为pending、aborted和committed。
54.图3是本申请实施例提供的一种事务对象的事务状态变化示意图,如图3所示,示例性的,在刚创建事务对象时,事务对象处于事务等待状态,对应的事务状态码为“pending”,在对应事务执行过程中,若事务执行失败或出错,事务对象变更为事务终止状态,对应事务状态码被变更为“aborted”,若事务正常执行并在成功提交事务对象时,事务对象变更为事务完成状态,对应事务状态码被变更为“committed”,若提交失败,事务对象变更为事务终止状态,对应事务状态码被变更为“aborted”。
55.其中,事务对象的事务状态码决定了指向它的数据对象的数据值是应该取自数据值还是期望值。当事务对象的事务状态码是“pending”或“aborted”时,对应的数据对象的数据值值应该取自数据值;当事务对象的事务状态码是“committed”时,对应的数据对象的数据值应该取自期望值。
56.具体的,在接收到写操作指令时,响应于该写操作指令创建事务对象,并确定该事务对象的事务标识和事务版本号。
57.s202:确定所述事务对象指向的数据对象的数据版本号和数据值。
58.s203:基于比较交换操作,利用所述事务对象的事务标识赋值给每个所述数据对象的关联事务标识,以将所述事务对象与所述数据对象进行关联。
59.具体的,在确定事务对象指向的数据对象后,基于比较交换操作将该事务对象的事务标识赋值给每一个确定的数据对象的关联事务标识,即将数据对象的关联事务标识的值设置为该事务对象的事务标识,从而将该事务对象与上述确定的数据对象进行关联。
60.可以理解的是,在向存储节点读取事务对象时,若事务对象的关联事务标识为非空值,可确认该数据对象关联有事务对象。在进行关联操作的过程中,如果有其它的并发事务也同时更新了数据对象,那么当前比较交换操作将会失败,终止当前事务并删除相应事务对象。
61.s204:依据写操作指令对每个关联的所述数据对象的数据值进行相应的数据操作,并将执行数据操作后的数据值赋值给对应的所述数据对象的期望值。
62.具体的,针对每个关联的数据对象,依据写操作指令指示的对不同数据对象的数
据值执行相应的数据操作,并将对数据值进行数据操作得到的操作结果赋值给相应数据对象的期望值。
63.s205:对每个所述数据对象的数据版本号进行版本号升级处理。
64.具体的,针对每个关联的数据对象,在关联数据对象和事务对象,并为数据对象的期望值赋值后,在上述确定的数据对象的数据版本号基础上,对数据版本号进行版本号升级处理,即对数据版本号进行加一处理,将更新后的数据版本号修改到对应数据对象的数据版本号中,并返回该更新后的数据版本号。
65.在一个实施例中,在确定更新后的数据版本号之后,还包括:基于所述比较交换操作返回的操作结果指示判断比较交换操作是否操作成功,若比较交换操作失败,则删除所述事务对象。
66.具体的,在基于比较交换操作,对数据对象和事务对象进行关联以及对期望值和数据版本号进行更新后,比较交换操作将返回相应的更新后的数据版本号以及操作结果指示(status)。其中操作结果指示用于指示比较交换操作是否操作成功,若比较交换操作失败(对应比较交换操作失败的操作结果指示status==error,对应比较交换操作成功的操作结果指示status!=error),则终止该事务对象,并将该事务对象的事务状态码设置为“aborted”。
67.s206:判断所述事务版本号与所述事务对象的当前事务版本号是否一致。若是,则跳转至步骤s207,否则跳转至步骤s208。
68.在对数据对象进行比较交换操作后,进一步的进行事务对象的提交(commit)。本实施例对事务对象的提交操作同样基于比较交换操作进行,在有多个请求端同时并发地更新同一个事务对象时,那么将只有其中的一个请求端的事务提交操作是成功的,其它的事务提交操作都将失败。
69.具体的,确定对应事务对象的当前事务版本号,将先前创建事务对象时确定的事务版本号与当前事务版本号进行比较,若事务版本号与当前事务版本号一致,认为该事务对象的事务版本号未被其他事务进程修改,并跳转至步骤s207,若事务版本号与当前事务版本号不一致,认为该事务对象的事务版本号已被其他事务进程修改,并跳转至步骤s208。
70.s207:将所述事务对象的事务状态设置为事务完成状态,并更新所述事务版本号。
71.具体的,在事务版本号与当前事务版本号一致时,将事务对象的事务状态设置为事务完成状态,即将该事务对象的事务状态码设置为“committed”,然后将对应事务版本号进行加一操作,以对事务版本号进行更新。
72.可以理解的是,在更新事务版本号后,其余事务在提交该事务对象时,其输入的事务版本号未更新,其余事务的事务提交操作将失败。
73.s208:判断所述事务对象的事务状态是否为事务完成状态。若是,则跳转至步骤s209,否则跳转至步骤s210。
74.具体的,判断事务对象的事务状态码是否为“committed”,若是,则确定事务对象的事务状态为事务完成状态,并跳转至步骤s209,否则,跳转至步骤s210。
75.s209:基于所述数据版本号的同步状态,根据所述数据对象的期望值对数据值进行修改,并更新所述数据版本号。
76.在事务对象的事务状态为事务完成状态时,进一步根据数据版本号的同步状态对
各数据对象进行更新,以执行对数据对象的清理工作。其中,对数据对象的清理工作由各数据对象对应的存储节点执行。具体的,在事务完成状态下对数据对象进行更新包括步骤s2091

s2092:
77.s2091:判断所述数据版本号与所述数据对象的当前数据版本号是否一致。
78.s2092:若是,则将所述数据对象的数据值设置为期望值,并将所述数据对象的期望值以及关联事务标识设置为空值,同时对所述数据对象的数据版本号进行版本号升级处理。
79.具体的,对于各个数据对象,确定数据对象的当前数据版本号,并将上述比较交换操作(步骤s205)中返回的数据版本号与当前数据版本号进行比较。
80.在数据版本号与当前数据版本号一致时(此时数据版本号处于同步状态),将对应数据对象的数据值设置为上述比较交换操作(步骤s204)中确定的期望值,然后将对应数据对象的期望值以及关联事务标识设置为空值,对数据对象的数据版本号进行版本号升级处理(数据版本号加一处理),并保存修改后的数据对象。而在数据版本号与当前数据版本号不一致时(此时数据版本号处于非同步状态),返回数据更新错误信息。
81.s210:根据所述数据版本号的同步状态,对所述数据对象进行回滚操作,并更新所述数据版本号。
82.在事务对象的事务状态为非事务完成状态(即事务等待状态或事务终止状态)时,进一步的根据数据版本号的同步状态对各数据对象进行回滚,以执行对数据对象的清理工作。具体的,在非事务完成状态下对数据对象进行回滚包括步骤s2101

s2102:
83.s2101:判断所述数据版本号与所述数据对象的当前数据版本号是否一致。
84.s2102:若是,则将所述数据对象的期望值以及关联事务标识设置为空值,并对所述数据对象的数据版本号进行版本号升级处理。
85.具体的,对于各个数据对象,确定数据对象的当前数据版本号,并将上述比较交换操作(步骤s205)中返回的数据版本号与当前数据版本号进行比较。
86.在数据版本号与当前数据版本号一致时,将对应数据对象的期望值以及关联事务标识设置为空值,对数据对象的数据版本号进行版本号升级处理(数据版本号加一处理),以完成对数据对象的回滚操作,并保存修改后的数据对象。而在数据版本号与当前数据版本号不一致时,返回数据回滚错误信息。
87.在一个可能的实施例中,在完成对数据对象的清理操作后,进一步终止对应的事务并根据事务标识删除对应的事务对象,以进行对事务对象的清理操作。
88.s211:响应于读操作指令,根据所述读操作指令指向的数据对象的关联事务标识。
89.具体的,在需要读取数据对象时,响应于读取请求终端发出的读操作指令,确定该读操作指令所指向的数据对象,并获取对应数据对象的关联事务标识。
90.s212:判断所述数据对象是否关联有事务对象。若是,则跳转至步骤s213,否则跳转至步骤s214。
91.具体的,判断关联事务标识是否为非空值(即判断是否xid!=null),以判断对应数据对象是否关联有事务对象。若关联事务标识为非空值(即xid!=null为真),则判定数据对象关联有事务对象,并跳转至步骤s213对数据对象进行清理操作后再返回数据对象的数据版本号和数据值。若关联事务标识为控制(即xid!=null为假),并跳转至步骤s214直
接返回数据对象的数据版本号和数据值。
92.s213:对所述数据对象关联的事务对象进行清理操作。
93.在需要读取的数据对象关联有事务对象时,存在之前对数据对象或事务对象的清理工作出现异常的情况,需要根据关联的事务对象的事务状态对数据对象和事务对象进行清理操作,保证数据对象和事务对象最终得到清理后,再返回数据对象的数据版本号和数据值。
94.图4是本申请实施例提供的一种对事务对象的清理操作的流程图,参考图4,具体的,本实施例提供的对事务对象的清理操作具体包括步骤s2131

s2136:
95.s2131:判断所述事务对象的事务状态是否为事务等待状态。若是,则跳转至步骤s2132,否则跳转至步骤s2133。
96.具体的,根据获取到的关联事务标识获取对应事务对象的事务状态码,并根据事务状态码判断该关联的事务对象的事务状态是否为事务等待状态,即判断事务状态码是否为“pending”,若是,则事务状态为事务等待状态,跳转至步骤s2132,否则,跳转至步骤s2133。
97.s2132:删除所述事务对象。
98.在事务状态为事务等待状态时,终止对应事务并删除对应事务对象,完成对事务对象的清理操作,并跳转至步骤s214。
99.在一个可能的实施例中,在事务状态为事务等待状态时,在事务等待状态持续达到设定等待时长之后再删除事务对象,以确保对应事务出现异常时才删除事务对象。在事务状态为事务等待状态下删除事务对象具体包括:
100.若事务状态为事务等待状态,则判断所述事务等待状态是否持续达到设定等待时长;若达到设定等待时长,则删除所述事务对象,否则返回判断所述事务对象的事务状态是否为事务等待状态。
101.具体的,在事务状态码为“pending”时,根据该事务对象的事务时间戳计算该事务对象从创建到目前的持续时间,该持续时间即为事务对象处于事务等待状态的持续时长,并将该持续时长与设定等待时长(例如1

5s)进行比较。在持续时长大于等于设定等待时长时,终止对应事务并删除对应事务对象,完成对事务对象的清理操作,并跳转至步骤s214。而在持续时长小于设定等待时长时,返回步骤s2131重新判断所述事务对象的事务状态是否为事务等待状态。
102.s2133:判断所述事务对象的事务状态是否为事务终止状态。若是,则跳转至步骤s2134,否则跳转至步骤s2135。
103.具体的,判断事务状态码是否为“aborted”,若是,则判定事务状态为事务终止状态,跳转至步骤s2134,否则跳转至步骤s2135。
104.s2134:对所述数据对象进行回滚操作。
105.在事务状态为事务终止状态时,则对数据对象进行回滚操作,完成对事务对象的清理操作,并跳转至步骤s214。对数据对象的回滚操作可参考步骤s2101

s2102,本实施例不再赘述。
106.s2135:判断所述事务对象的事务状态是否为事务完成状态。
107.具体的,判断事务状态码是否为“committed”,若是,则判定事务状态为事务完成
状态,并跳转至步骤s2136,否则跳转至步骤s214。
108.s2136:根据所述数据对象的期望值对数据值进行修改。
109.在事务状态为事务完成状态时,根据将数据对象的数据值修改为数据对象的期望值,完成对事务对象的清理操作,并跳转至步骤s214。对数据值的修改可参考步骤s2091

s2092,本实施例不再赘述。
110.s214:返回所述数据对象的数据版本号和数据值。
111.向发出读操作指令的读取请求终端返回对应数据对象的数据版本号和数据值,以供请求终端进行后续使用。
112.图5是本申请实施例提供的一种转账事务的流程图,图6是本申请实施例提供的一种转账事务中存储节点和客户端的关系示意图。如图5和图6所示,账户a和账户b对应的数据对象a和b本别保存在存储节点1和存储节点2中,在转账事务开始前数据对象a的存储数据为:a={version:12,value:500,expected_value:null,xid:null},数据对象b的存储数据为b={version:3,value:100,expected_value:null,xid:null}。假设在一次转账操作中,需要同时更新转出账户和转入账户:将转出账户a的资金余额减少amount数量(图中以amount=100为例),同时将转入账户b的资金余额增加amount数量,两个账户的资金余额要么都更新成功,要么都没有更新。基于本实施例提供的分布式数据库事务原子性实现方法执行该转账事务,在需要执行转账事务时,由外部输入(图5中actor)向作为事务管理器的客户端发出写操作指令,通知事务管理器响应于写操作指令创建事务对象,得到该事务对象的事务版本号tx_version和事务标识xid(假设xid为a1),然后根据转账事务对应的数据对象,获取数据对象a的数据版本号version1和数据值value1,以及数据对象b的数据版本号version2和数据值value2。此时数据对象a和数据对象b均未关联事务对象a1(即对应的xid为null)。
113.进一步的,基于比较交换操作(cas_prepare),通知存储节点1对数据对象a和事务对象进行关联、对数据值value1进行相应数据操作:value1+100,并将value1+100赋值给数据对象a的期望值expected_value1,对数据版本号version1进行加一并返回新的version1,通知存储节点2对数据对象b和事务对象进行关联、对数据值value2进行相应数据操作:value2

100,并将value2

100赋值给数据对象b的期望值expected_value2,对数据版本号version2进行加一并返回新的version2,此时数据对象a的存储数据为:a={version:13,value:500,expected_value:400,xid:a1},数据对象b的存储数据为b={version:3,value:100,expected_value:null,xid:a1}。
114.在对数据对象和事务对象进行关联、对数据值进行相应数据操作并成功返回新的数据版本号后,向客户端提交该转账事务(commit(xid,tx_version)),在转账事务提交成功后,基于比较交换操作(cas_commit),通知存储节点1将数据对象a的数据值value1替换为期望值expected_value1,然后清空期望值expected_value1以及关联事务标识xid,对数据版本号version1进行加一并保存更新后的数据对象a;通知存储节点2将数据对象b的数据值value2替换为期望值expected_value2,然后清空期望值expected_value2以及关联事务标识xid,对数据版本号version2进行加一并保存更新后的数据对象b。此时数据对象a的存储数据为:a={version:14,value:400,expected_value:null,xid:null},数据对象b的存储数据为b={version:5,value:200,expected_value:null,xid:null},完成了该转账
事务的同时实现了分布式数据库事务的原子性。
115.可以理解的是,除上述应用场景外,还可在其他高频业务场景中应用本申请提供的分布式数据库事务原子性实现方法,例如电商业务的支付、好友关系的维护等应用场景。示例性的,假设用户a关注了用户b,这一个业务动作对应如下的数据操作为:1、在a的关注列表中加入b;2、在b的粉丝列表中加入a,此时业务系统希望这一个业务动作对应的数据操作是原子执行的,本申请提供的分布式数据库事务原子性实现方法正好可以解决这样的问题,同时还可以提升业务开发的效率。
116.上述,通过创建事务对象,并确定事务对象指向的数据对象的数据版本号和数据值,基于比较交换操作,通过事务标识将事务对象和数据对象进行关联,并依据写操作指令对数据对象执行数据操作,从而将执行数据操作后的数据值赋值给数据对象的期望值,并更新数据版本号,在事务对象成功提交并且数据版本号未被其他进程修改时,将数据对象的数据值修改为期望值,并更新数据版本号,完成对数据对象的写操作,将事务管理器的功能放在客户端,借助分布式nosql数据库系统的无锁比较交换操作,实现分布式数据库事务的原子性。采用非集中式的数据库事务管理器架构,将事务管理器分布到多个客户端,具备大规模应用的能力,有效提高事务的并发量以及现有系统的扩展性,并基利用比较交换操作代替锁机制,有效减少事务执行等待时间并降低了现有系统的响应时延,提高了分布式nosql数据库事务的吞吐量。同时,在响应读操作时,若在之前的写操作未能正常清理数据对象和事务对象,则在读操作流程中进一步对数据对象和事务对象进行清理,保证数据对象的正确性和可读性。
117.图7是本申请实施例提供的一种分布式数据库事务原子性实现装置的结构示意图。如图7所示,该分布式数据库事务原子性实现装置包括事务创建模块31、数据获取模块32、数据操作模块33和修改执行模块34。
118.其中,事务创建模块31,用于响应于写操作指令创建事务对象,并确定所述事务对象的事务标识;数据获取模块32,用于确定所述事务对象指向的数据对象的数据版本号和数据值;数据操作模块33,用于基于比较交换操作,通过所述事务标识将所述事务对象与每个所述数据对象进行关联,并依据写操作指令对关联的所述数据对象执行相应的数据操作,以将执行数据操作后的数据值赋值给所述数据对象的期望值,并确定更新后的数据版本号;修改执行模块34,用于基于所述事务对象的事务状态以及所述数据版本号的同步状态,根据所述数据对象的期望值对数据值进行修改,并更新所述数据版本号。
119.上述,通过创建事务对象,并确定事务对象指向的数据对象的数据版本号和数据值,基于比较交换操作,通过事务标识将事务对象和数据对象进行关联,并依据写操作指令对数据对象执行数据操作,从而将执行数据操作后的数据值赋值给数据对象的期望值,并更新数据版本号,在事务对象成功提交并且数据版本号未被其他进程修改时,将数据对象的数据值修改为期望值,并更新数据版本号,完成对数据对象的写操作,将事务管理器的功能放在客户端,借助分布式nosql数据库系统的无锁比较交换操作,实现分布式数据库事务的原子性,有效提高事务的并发量,减少事务执行等待时间,提高了分布式nosql数据库事务的吞吐量。
120.本申请实施例还提供了一种计算机设备,该计算机设备可集成本申请实施例提供的分布式数据库事务原子性实现装置。参考图8,该计算机设备包括:输入装置43、输出装置
44、存储器42以及一个或多个处理器41;所述存储器42,用于存储一个或多个程序;当所述一个或多个程序被所述一个或多个处理器41执行,使得所述一个或多个处理器41实现如上述实施例提供的分布式数据库事务原子性实现方法。上述提供的分布式数据库事务原子性实现装置、设备和计算机可用于执行上述任意实施例提供的分布式数据库事务原子性实现方法,具备相应的功能和有益效果。
121.本申请实施例还提供一种包含计算机可执行指令的存储介质,所述计算机可执行指令在由计算机处理器执行时用于执行如上述实施例提供的分布式数据库事务原子性实现方法。当然,本申请实施例所提供的一种包含计算机可执行指令的存储介质,其计算机可执行指令不限于如上所述的分布式数据库事务原子性实现方法,还可以执行本申请任意实施例所提供的分布式数据库事务原子性实现方法中的相关操作。上述实施例中提供的分布式数据库事务原子性实现装置、设备及存储介质可执行本申请任意实施例所提供的分布式数据库事务原子性实现方法,未在上述实施例中详尽描述的技术细节,可参见本申请任意实施例所提供的分布式数据库事务原子性实现方法。
122.上述仅为本申请的较佳实施例及所运用的技术原理。本申请不限于这里所述的特定实施例,对本领域技术人员来说能够进行的各种明显变化、重新调整及替代均不会脱离本申请的保护范围。因此,虽然通过以上实施例对本申请进行了较为详细的说明,但是本申请不仅仅限于以上实施例,在不脱离本申请构思的情况下,还可以包括更多其他等效实施例,而本申请的范围由权利要求的范围决定。
当前第1页1 2 3 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1