图形数据库中联机事务的实现方法转让专利

申请号 : CN201110072982.1

文献号 : CN102193986B

文献日 :

基本信息:

PDF:

法律信息:

相似专利:

发明人 : 陈升于洪方井卫军蒋建平陈晞刘健

申请人 : 北京世纪互联宽带数据中心有限公司

摘要 :

本发明涉及图形数据库中联机事务的实现方法,包括步骤:1)新建联机事务。2)进行联机事务数据操作。3)提交联机事务:标记事务提交状态;读取该条记录的associate_node列中的相关节点名称,依次处理相应节点中的与本次事务相关的脏数据;删除DataSet中对应该事务的那条记录。若提交联机事务成功则结束,否则回滚联机事务。本发明的优点是联机事务以“事务ID”进行标识,不受调用客户端程序的连接限制,同一事务可以在多个客户端间共享,非常方便地实现分布式事务。

权利要求 :

1.一种图形数据库中联机事务的实现方法,其特征在于:联机事务处理自上而下分为三层:

最上层为暴露给外部调用程序的API;

中间层为事务逻辑控制层,按操作类别分为同步区与非同步区,同步区意味着在同一时间只能有一个操作进行,其他操作在进入同步区之间均处于等待状态,同步区中该功能的机制利用Java语言的线程同步锁定特性实现,非同步区的操作则不受限制,在任何时间均可以进行;

最下层为存储数据的DataSet操作抽象层,在DataSet中,保存有联机事务自身的状态信息,以及数据的事务状态属性信息;

将图形数据库中联机事务的状态数据存储在名称为graphic_db_tx_def的数据集DataSet中,该DataSet的数据结构如下:在图形数据库中每一个Node均有一个数据集DataSet,该DataSet中缺省内置如下两个列:执行以下步骤:

1)新建联机事务;

2)进行联机事务数据操作;

3)提交联机事务,若提交联机事务成功则结束,否则进行下一步骤;

4)回滚联机事务;

在所述步骤1)中,新建联机事务的详细步骤是:

1.1)生成一个全局唯一事务ID;

1.2)获取当前系统时间;

1.3)在名称为graphic_db_tx_def的DataSet中插入一条新的记录,将生成的事务ID填入该记录的tx_no列中,将获取的当前系统时间填入该记录的start_time列中;

1.4)将新生成的事务ID返回;

在所述步骤2)中,对本次事务中的每一次操作进行如下步骤:

2.1)获取本次所操作的节点的名称;

2.2)将该节点的名称保存到graphic_db_tx_def的associate_node列中,若该节点的名称在前面未保存过,则在associate_node列中将该节点的名称与前面的节点名称之间以逗号分隔;否则本次操作中不再保存节点名称;

2.3)同时将当前的系统时间更新到graphic_db_tx_def的列start_time中;

在所述步骤3)中,提交联机事务的详细步骤是:

3.1)标记事务提交状态,查询名称为graphic_db_tx_def的DataSet,将其中对应该事务的那条记录的is_commit列的值置为1;

3.2)读取该条记录的associate_node列中的相关节点名称,依次处理相应节点中的与本次事务相关的脏数据,将其转换为正式数据,即,将相应节点的DataSet中的_dirty列的值改为-1;

3.3)删除graphic_db_tx_def的DataSet中对应该事务的那条记录,事务提交完成;

在所述步骤4)中,回滚联机事务的详细步骤是:

4.1)标记事务回滚状态,查询名称为graphic_db_tx_def的DataSet,将其中对应该事务的那条记录的is_rollback列的值置为1;

4.2)读取该条记录的associate_node列中的相关节点名称,依次恢复相应节点中的与本次事务相关的脏数据,即,将相应节点的DataSet中的_dirty列的值恢复为1;

4.3)删除graphic_db_tx_def的DataSet中对应该事务的那条记录,事务回滚完成;

在提交联机事务的过程中还进行事务过期处理:

定期检查名称为graphic_db_tx_def的DataSet中的数据,对每条记录作如下检查:将当前的系统时间与记录中的start_time进行比较,如果当前时间与start_time的差大于设定的事务处理时间,则意味着该条事务已经过期,然后检查该条事务记录的processing列的值,如果值为1,则说明该事务正在操作中,本次不对该事务记录进行过期处理,事务过期处理结束,反之,继续执行下一步骤;

标记事务过期状态,将graphic_db_tx_def的DataSet中对应该事务的那条记录的is_timeout列的值置为1;

读取该条记录的associate_node列中的相关节点名称,依次恢复相应节点中的与本次事务相关的脏数据,即,将相应节点的DataSet中的_dirty列的值恢复为1;

删除graphic_db_tx_def的DataSet中对应该事务的那条记录,事务过期处理完毕。

说明书 :

图形数据库中联机事务的实现方法

技术领域

[0001] 本发明涉及一种图形数据库中联机事务的实现方法。

背景技术

[0002] 通常在数据库系统中,事务是工作的离散单位。例如,一个数据库事务可以是修改一个用户的帐户平衡或库存项的写操作。联机事务处理系统实时地采集处理与事务相连的数据以及共享数据库和其它文件的地位的变化。在联机事务处理中,事务是被立即执行的。在单一用户、单一数据库环境下执行事务是简单的,这是因为没有冲突问题或对数据库间同步的需求。在一个分布式环境下,写操作经常并行地在多个数据库服务器上发生。这样的并发事务处理需要一个“卷回”机制,以保证在一次写操作中系统失效的情况下,仍保证数据库的完整性。事务要么一起确认,要么放弃。如果一个或多个与事务有关的系统响应不一致,这意味着系统或通信可能出现了故障,因而就会放弃一个事务。可以看出,当多个用户试图同时改变数据的同一块时,就出现了冲突问题。

发明内容

[0003] 为了解决上述问题,本发明提出了一种图形数据库中联机事务的实现方法,以实现对联机事务的控制。
[0004] 本发明采用的技术方案如下:
[0005] 一种图形数据库中联机事务的实现方法,其特征在于:
[0006] 联机事务处理自上而下分为三层:
[0007] 最上层为暴露给外部调用程序的API;
[0008] 中间层为事务逻辑控制层,按操作类别分为同步区与非同步区,同步区意味着在同一时间只能有一个操作进行,其他操作在进入同步区之间均处于等待状态,该机制利用Java语言的线程同步锁定特性实现,非同步区的操作则不受限制,在任何时间均可以进行;
[0009] 最下层为存储数据的DataSet操作抽象层,在DataSet中,保存有联机事务自身的状态信息,以及数据的事务状态属性信息;
[0010] 将图形数据库中联机事务的状态数据存储在名称为graphic_db_tx_def的数据集DataSet中,该DataSet的数据结构如下:
[0011]
[0012] 在图形数据库中每一个Node均有一个数据集DataSet,该DataSet中缺省内置如下两个列:
[0013]
[0014] 执行以下步骤:
[0015] 1)新建联机事务;
[0016] 2)进行联机事务数据操作;
[0017] 3)提交联机事务,若提交联机事务成功则结束,否则进行下一步骤;
[0018] 4)回滚联机事务。
[0019] 进一步地:
[0020] 在所述步骤1)中,新建联机事务的详细步骤是:1.1)生成一个全局唯一事务ID;1.2)获取当前系统时间;1.3)在名称为graphic_db_tx_def的DataSet中插入一条新的记录,将生成的事务ID填入该记录的tx_no列中,将获取的当前系统时间填入该记录的start_time列中;1.4)将新生成的事务ID返回。
[0021] 在所述步骤2)中,对本次事务中的每一次操作进行如下步骤:2.1)获取本次所操作的节点的名称;2.2)将该节点的名称保存到graphic_db_tx_def的associate_node列中,若该节点的名称在前面未保存过,则在associate_node列中将该节点的名称与前面的节点名称之间以逗号分隔;否则本次操作中不再保存节点名称;2.3)同时将当前的系统时间更新到graphic_db_tx_def的列start_time中。
[0022] 在所述步骤3)中,提交联机事务的详细步骤是:3.1)标记事务提交状态,查询名称为graphic_db_tx_def的DataSet,将其中对应该事务的那条记录的is_commit列的值置为1;3.2)读取该条记录的associate_node列中的相关节点名称,依次处理相应节点中的与本次事务相关的脏数据,将其转换为正式数据,即,将相应节点的DataSet中的dirty列的值改为-1;3.3)删除graphic_db_tx_def的DataSet中对应该事务的那条记录,事务提交完成。
[0023] 在所述步骤4)中,回滚联机事务的详细步骤是:4.1)标记事务回滚状态,查询名称为graphic_db_tx_def的DataSet,将其中对应该事务的那条记录的is_rollback列的值置为1;4.2)读取该条记录的associate_node列中的相关节点名称,依次恢复相应节点中的与本次事务相关的脏数据,即,将相应节点的DataSet中的dirty列的值恢复为1;4.3)删除graphic_db_tx_def的DataSet中对应该事务的那条记录,事务回滚完成。
[0024] 在提交联机事务的过程中还进行如下事务过期处理:
[0025] 定期检查名称为graphic_db_tx_def的DataSet中的数据,对每条记录作如下检查:
[0026] 将当前的系统时间与记录中的start_time进行比较,如果当前时间与start_time的差大于设定的事务处理时间,则意味着该条事务已经过期,然后检查该条事务记录的processing列的值,如果值为1,则说明该事务正在操作中,本次不对该事务记录进行过期处理,事务过期处理结束,反之,继续执行下一步骤;
[0027] 标记事务过期状态,将graphic_db_tx_def的DataSet中对应该事务的那条记录的is_timeout列的值置为1;
[0028] 读取该条记录的associate_node列中的相关节点名称,依次恢复相应节点中的与本次事务相关的脏数据,即,将相应节点的DataSet中的dirty列的值恢复为1;
[0029] 删除graphic_db_tx_def的DataSet中对应该事务的那条记录,事务过期处理完毕。本发明具有以下优点:
[0030] 联机事务以“事务ID”进行标识,不受调用客户端程序的连接限制,同一事务可以在多个客户端间共享,非常方便的实现分布式事务。

附图说明

[0031] 图1为图形数据库的架构;
[0032] 图2为节点之间的关系图;
[0033] 图3为数据在DataSet中的存储方式;
[0034] 图4为节点之间的引用图;
[0035] 图5为联机事务处理流程;
[0036] 图6联机事务处理的结构。

具体实施方式

[0037] 本发明提出了一种图形数据库中联机事务的实现方法,下面结合附图详细说明。
[0038] 图形数据库概述
[0039] 本发明图形数据库的架构自上而下可以分为三层。如图1所示,最上层为图形数据中各种概念对象的组织与实现。中间层为抽象的数据物理存储接口层,将物理存储的数据抽象为若干个数据集DataSet。底层为物理存储实现层,由程序借助现有的存储引擎实现,比如:传统的关系数据库,XML文件等等。
[0040] DataSet(数据集)
[0041] DataSet是图形数据库中数据的逻辑存储单元,图形数据库中的数据以及数据库自身的逻辑定义均存储在DataSet中,DataSet是一个抽象的接口,真实的数据可以通过遵循DataSet接口的实现程序存储在关系数据库、XML或自定义格式的文件中。每一个DataSet由一个全局唯一的名称和若干个列(Column)组成。DataSet中的列表支持如下两种数据类型:
[0042]类型 说明
String 用于保存文本性的描述信息
Number 用于保存整数、浮点数等数字信息,或用来保存布尔值信息,用1表示true,用-1表示false.
[0043] 表1
[0044] Node(节点)
[0045] Node为图形数据库中存储数据的逻辑单元,在图形数据库中,每一种记录实体均可抽象为Node,比如在表述一个计算机网络应用系统时,交换机中的端口、PC服务器的网卡、CPU、生产配件的厂商、我们为之提供服务的客户、系统中的用户、权限等等,每个Node拥有一个全局唯一的名称,和一些其特有的属性,用于记录配置信息,例如:相对于我们服务的客户,我们将其命名为Customer,其拥有如下属性:contractedAmount(合同总额)、industry(所属行业)、name(客户名称)、description(描述)等。在本发明中,Node的属性可以是如下类型的数据。
[0046]
[0047] 表2
[0048] 每一个Node的定义信息均保存在名称为graphic_db_node_def的DataSet中,该DataSet的数据结构如下:
[0049]列名称 数据类型 说明
node_id Number 全局唯一的ID
name String 用于保存Node的名称
[0050] 表3
[0051] 每一个Node中所定义的属性信息保存在名称为graphic_db_node_attr_def的DataSet中,该DataSet的数据结构如下:
[0052]
[0053] 表4
[0054] 针对于Node的定义,物理存储的DataSet类似如下两个表:
[0055]
[0056]
[0057] 表5
[0058]
[0059] 表6
[0060] 每一个Node的数据信息保存在与其同名的DataSet中,假设我们有一个名称为Customer的Node,该Node有如下属性:
[0061]属性名称 数据类型 说明
RID String 数据库内置
name String 客户名称
contractedAmount Number 合同金额
industry Reference 所属行业
description String 客户描述信息
[0062] 表7
[0063] 则该Node对应的DataSet结构为:
[0064]
[0065] 表8
[0066] 物理存储的DataSet类似下表:
[0067]
[0068] 表9
[0069] RID(记录ID,Record ID)
[0070] 在图形数据库中,每一个Node都会有一个名称为RID的属性,存储在Node中的每一条数据的RID值均是全局唯一的,作为该条记录在图形数据库中的标识。RID的数据类型为String型。每一个Node均含有该属性。RID格式为:Node名称+下划线+递增数字,一个典型的RID数值类似于如下形式:Industry_109。
[0071] Relation(关系)
[0072] 每一类信息的实体均可以抽象为Node,在现实应用中,常常需要将这些Node按某种逻辑组织起来,Relation就是用来描述Node与Node之间的组织关系的。假设现在已有代表客户的Node:Customer,代表系统用户的Node:SysUser,在现实世界中,我们的一个销售人员会成为系统中的一个用户,并负责一些客户的销售、及沟通工作。因此,我们可以在SysUser与Customer之间建立一个名为SysUserServeCustomer的Relation来表述两者之间的关系。我们用图2来表述这种关系,Relation就是用于描述Node与Node之间关系的特殊对象。每一个Relation均有一个全局唯一的名称,一个源Node,一个目标Node。由源Node到目标Node的方向,我们称之为正向,由目标Node到起始Node的方向我们称之为反向。
[0073] 每一个Relation的定义信息均保存在名称为graphic_db_relation_def的DataSet中,该DataSet的数据结构如下:
[0074]列名称 数据类型 说明
relation_id Number 全局唯一的ID
name String 用于保存Relation的名称
source_node Number 源Node的ID
target_node Number 目标Node的ID
[0075] 表10
[0076] 针对于Relation的定义,物理存储的DataSet类似下表:
[0077]
[0078] 表11
[0079] 按照Relation的定义,两个通过Relation连接的Node中的数据可以建立连接。所有数据的连接信息保存在名称为graphic_db_relation_record_def的DataSet中,该DataSet的数据结构如下:
[0080]
[0081]
[0082] 表12
[0083] 在应用场景中,其物理存储的DataSet类似下表:
[0084]
[0085] 表13
[0086] Reference(引用)
[0087] 在图形数据库抽象中,一些常用的Node会与其他大部分Node有关系,这些常用的Node数据量很有限、且基本不会发生变化,比如:国家、省、市等。如果采用Relation的方式来表述的话,则需要与其他Node之间建立的大量关系,这对后期的维护将会造成一定的困难。在此种情形下,可以考虑采用Reference的形式来表述关系。一个Node通过其所拥有的属性引用另外一个Node,在其实现形式上,很大程度与RDBMS(关系数据库)的Foreign Key(外键)相类似。某一条记录的Dictionary属性中保存的是另外一个Node中数据记录的RID。考虑之前我们讨论过的Node——Customer,拥有(industry)行业这一属性,假设在我们的应用场景中,行业的数量很有限,且不会经常发生变化。则可以用Reference属性的方式引用Industry这一Node中的某条记录。数据在DataSet中的存储方式如图3所示。
[0088] 在本发明中我们用虚线表示Node之间的Reference,以区别于Relation,见图4。
[0089] 联机事务与非联机事务
[0090] 图形数据库中数据的操作可分为:“联机事务数据操作”与“非联机事务数据操作”。联机事务数据操作步骤依次为:创建联机事务、进行联机事务数据操作(在一个联机事务中该操作可以重复多次)、提交联机事务使操作生效或者回滚联机事务放弃操作。见图5所示。而非联机事务数据操作不受事务控制,直接调用图形数据库API即可。
[0091] 如图6所示,本发明的联机事务处理自上而下分为三层:
[0092] 最上层为暴露给外部调用程序的API。
[0093] 中间层为事务逻辑控制层,按操作类别分为同步区与非同步区,同步区意味着在同一时间只能有一个操作进行,其他操作在进入同步区之间均处于等待状态,该机制利用Java语言的线程同步锁定特性实现。非同步区的操作则不受限制,在任何时间均可以进行。
[0094] 最下层为存储数据的DataSet操作抽象层,在DataSet中,保存有联机事务自身的状态信息,以及数据的事务状态属性信息。
[0095] 在图形数据库中,联机事务的状态数据存储在名称为graphic_db_tx_def的DataSet中,该DataSet的数据结构如下:
[0096]
[0097] 表14
[0098] 在图形数据库中每一个Node均有一个相对应的同名的DataSet,数据之间的Relation信息保存在名称为graphic_db_relation_record_def的DataSet中。这些DataSet中均缺省内置如下两个列:
[0099]
[0100] 表15
[0101] 新建事务处理流程
[0102] 当接收到创建事务的API调用时,处理步骤如下:
[0103] (1)生成一个全局唯一事务ID。假设生成的事务ID为:123abc
[0104] (2)获取当前系统时间,假设当前系统时间为:1291739790803
[0105] (3)在名称为graphic_db_tx_def的DataSet中插入一条新的记录,将生成的事务ID填入该记录的tx_no列中,将获取的当前系统时间填入该记录的start_time列中。其记录值如下:
[0106]tx_no is_commit is_rollback is_timeout start_time associate_node processing
123abc -1 -1 -1 1291739790803 null -1
[0107] 表16
[0108] (4)将新生成的事务ID返回,即,将步骤(1)中生成的全局唯一的事务ID返回给调用API的客户端程序。
[0109] 事务中增、删、改数据时的处理流程
[0110] 在事务中进行增、删、改数据的操作时,首先获取所操作的节点的名称,将后将该节点的名称保存到graphic_db_tx_def的associate_node列中,假定生成的事务ID为123abc,事务的创建时间为1291739790803。则在新创建完事务后,数据的初始值如下:
[0111]tx_no is_commit is_rollback is_timeout start_time associate_node processing
123abc -1 -1 -1 1291739790803 null -1
[0112] 表17
[0113] 假定在本次事务中第一次操作的节点名称为Customer,当前的系统时间为1291739800000,则将Customer保存到graphic_db_tx_def的associate_node列中,同时将当前的系统时间更新到列start_time中,数据的值如下:
[0114]tx_no is_commit is_rollback is_timeout start_time associate_node processing
123abc -1 -1 -1 1291739800000 Customer -1
[0115] 表18
[0116] 假定在本次事务中第二次操作的节点名称为Contract,当前的系统时间为1291739801000,则将Contract也保存到graphic_db_tx_def的associate_node列中,不同的节点名称之间以逗号分隔。同时将当前的系统时间更新到列start_time中,数据的值如下:
[0117]tx_no is_commit is_rollback is_timeout start_time associate_node processing
123abc -1 -1 -1 1291739801000 Customer,Contract -1
[0118] 表19
[0119] 假定在本次事务中第三次操作的节点名称又是Customer,当前的系统时间为1291739802000,由于值为Customer的节点名已经在之前保存至associate_node列中,则本次不再保存节点名称。将当前的系统时间更新到列start_time中,数据的值如下:
[0120]tx_no is_commit is_rollback is_timeout start_time associate_node processing
123abc -1 -1 -1 1291739802000 Customer,Contract -1
[0121] 表20
[0122] 事务提交的处理流程
[0123] (1)标记事务提交状态。查询graphic_db_tx_def,假定所属事务编号为123abc,将该条记录is_commit列的值置为1,如下所示:
[0124]tx_no is_commit is_rollback is_timeout Start_time associate_node processing
123abc 1 -1 -1 1291739802000 Customer,Contract -1
[0125] 表21
[0126] (2)读取associate_node列中的相关节点名称,依次处理相应节点中的与本次事务相关的脏数据。将其转换为正式数据,即:更改相应节点DataSet中数据dirty列的值为-1,同时将_tx_no列的值设为null。
[0127] (3)删除名称为graphic_db_tx_def的DataSet中事务编号为123abc的数据记录。事务提交完成。
[0128] 事务回滚的处理流程
[0129] (1)标记事务回滚状态。查询graphic_db_tx_def,假定所属事务编号为123abc,将该条记录is_rollback列的值置为1,如下所示:
[0130]tx_no is_commit is_rollback is_timeout Start_time associate_node processing
123abc -1 1 -1 1291739802000 Customer,Contract -1
[0131] 表22
[0132] (2)读取associate_node列中的相关节点名称,依次恢复相应节点中的与本次事务相关的脏数据。
[0133] (3)删除名称为graphic_db_tx_def的DataSet中事务编号为123abc的数据记录。事务回滚完成。
[0134] 事务过期的处理流程
[0135] 在图形数据库中,通过周期为10毫秒的轮循程序检查名称为graphic_db_tx_def的DataSet中的数据,对每条记录的检查的步骤如下:
[0136] (1)将当前的系统时间与记录中的start_time进行比较,如果当前时间与start_time的差大于30000(30秒),则意味着该条事务已经过期,然后检查该条事务记录的processing列的值,如果值为1,则说明该事务正在操作中,本次不对该事务记录进行过期处理,事务过期处理结束。反之,继续执行步骤(2)。
[0137] (2)标记事务过期状态。假定该条记录的事务编号为123abc,将该条记录is_timeout列的值置为1,如下所示:
[0138]tx_no is_commit is_rollback is_timeout Start_time associate_node processing
123abc -1 -1 1 1291739802000 Customer,Contract -1
[0139] 表23
[0140] (3)读取associate_node列中的相关节点名称,依次恢复相应节点中的与本次事务相关的脏数据。
[0141] (4)删除名称为graphic_db_tx_def的DataSet中事务编号为123abc的数据记录。事务过期处理完毕。