发明内容
本发明所要解决的技术问题是提供一种应用于图形数据库联机事务中的增加节点数据关系的方法及系统,用以解决现有技术中存在冲突以及冲突导致的数据库中数据不完整的技术问题。
为解决上述技术问题,本发明提供的技术方案如下:
一种基于联机事务处理系统OLTP的增加节点数据关系的方法,包括:
步骤a,预先创建一个事务;
步骤b,接收所述事务的事务标识、源节点数据的标识以及目标节点数据的标识;
步骤c,根据所述事务标识查找所述事务的事务记录;
步骤d,根据所述事务记录判断所述事务是否有效,如果否,则执行步骤e,如果是,则执行步骤f;
步骤e,结束此次增加节点数据关系的操作;
步骤f,根据所述源节点数据的标识以及目标节点数据的标识,分别获取所述源节点数据记录与目标节点数据记录;
步骤g,根据所述源节点数据记录与目标节点数据记录,判断所述源节点数据和目标节点数据是否被其它事务锁定,如果是,则执行步骤h,如果否,则执行步骤i;
步骤h,等待预设时长;
步骤h1,判断所述事务是否超期,如果是,则执行步骤e,如果否,则返回步骤d;
步骤i,锁定所述事务记录,以确定所述事务被本次增加节点数据关系的操作所独占;
步骤j,满足预设条件时,将所述源节点数据的标识以及目标节点数据的标识,添加到所述事务记录中,建立所述源节点数据和目标节点数据的关系,生成关系记录,并将所述源节点数据和目标节点数据标记为脏数据;
步骤k,解除对所述事务记录的锁定。
优选的,上述方法中,所述步骤a具体包括:
a1,生成一个全局唯一的事务标识,并获取第一系统时间;
a2,在事务的状态数据的数据集中插入一条事务记录,所述事务记录包括所述事务标识和第一系统时间。
优选的,上述方法中,步骤j中,所述满足预设条件具体为:所述源节点数据和目标节点数据不存在关系记录。
优选的,上述方法中,所述方法还包括:当所述源节点数据和目标节点数据存在关系记录时,进一步判断所述关系记录是否被删除,如果是,则更新所述关系记录的状态,然后解除对所述事务记录的锁定;如果否,则直接解除对所述事务记录的锁定。
优选的,上述方法中,所述步骤k之前还包括:
步骤j1,将所述第一系统时间更新为生成关系记录完毕时的第二系统时间。
优选的,上述方法中,所述步骤k之后还包括:
步骤k1,将所述事务记录中的提交标识设置为有效;
步骤k2,分别将所述源节点数据记录与目标节点数据记录标记为不从属于所述事务,并分别将所述源节点数据记录与目标节点数据记录中的字段值更新为空;
步骤k3,删除所述事务记录。
优选的,上述方法中,所述步骤k之后还包括:
步骤ka,将所述事务记录中的回滚标识设置为有效;
步骤kb,删除所述关系记录和所述脏数据;
步骤kc,删除所述事务记录。
一种基于OLTP的增加节点数据关系的系统,包括:
创建单元,用于预先创建一个事务;
接收单元,用于接收所述事务的事务标识、源节点数据的标识以及目标节点数据的标识;
第一查找单元,用于根据所述事务标识查找所述事务的事务记录;
第一判断单元,用于根据所述事务记录判断所述事务是否有效;
终止操作单元,用于当所述第一判断单元的判断结果为否时,结束此次增加节点数据关系的操作;
第二查找单元,用于当所述第一判断单元的判断结果为是时,根据所述源节点数据的标识以及目标节点数据的标识,分别获取所述源节点数据记录与目标节点数据记录;
第二判断单元,根据所述源节点数据记录与目标节点数据记录,判断所述源节点数据和目标节点数据是否被其它事务锁定;
延迟单元,用于当所述第二判断单元的判断结果为是时,等待预设时长;
第三判断单元,用于在所述延迟单元等待预设时长后,判断所述事务是否超期,如果是,则返回所述终止操作单元,如果否,则返回所述第一判断单元;
锁定单元,用于当所述第二判断单元的判断结果为否时,锁定所述事务记录,以确定所述事务被本次增加节点数据关系的操作所独占;
数据关系添加单元,用于满足预设条件时,将所述源节点数据的标识以及目标节点数据的标识,添加到所述事务记录中,建立所述源节点数据和目标节点数据的关系,生成关系记录,并将所述源节点数据和目标节点数据标记为脏数据;
解锁单元,用于解除对所述事务记录的锁定。
优选的,上述系统中,还包括:
提交标识设置单元,用于将所述事务记录中的提交标识设置为有效;
脏数据处理单元,用于分别将所述源节点数据记录与目标节点数据记录标记为不从属于所述事务,并分别将所述源节点数据记录与目标节点数据记录中的字段值更新为空;
第一删除单元,用于删除所述事务记录。
优选的,上述系统中,还包括:
回滚标识设置单元,用于将所述事务记录中的回滚标识设置为有效;
第二删除单元,用于删除所述关系记录、脏数据以及事务记录。
与现有技术相比,本发明具有以下优点:
在本发明实施例中,可以保证在基于图形数据库的联机事务处理系统中增加节点数据关系时,可以解决现有技术中存在冲突以及冲突导致的数据库中数据不完整的技术问题,因为在进行增加节点数据关系的操作时,在确定事务有效,且源节点数据和目标节点数据没有被其它事务占用时,会对事务记录进行锁定,此时即便有其它的增加节点数据关系的操作,也会处于等待状态。因此,本实施例所公开的增加节点数据关系的方法,能够保证数据的完整性。
具体实施方式
为了使本技术领域的人员更好地理解本发明实施例中的技术方案,并使本发明实施例的上述目的、特征和优点能够更加明显易懂,下面结合附图对本发明实施例中技术方案作进一步详细的说明。
本发明的联机事务处理系统可以采用自上而下的三层结构实现,参考图1所示,为本发明中联机事务处理系统的分层结构示意图。最上层为面向外部调用程序的API(Application Programming Interface,应用程序编程接口)。API是一些预先定义的函数,目的是提供应用程序与用户基于某软件或硬件的以访问一组例程的能力,而又无需访问源码,或理解内部工作机制的细节。中间层为事务逻辑控制层,按操作类别分为同步区与非同步区,同步区中操作内容意味着在同一时间只能有一个操作进行,在该操作进行时其他操作在进入同步区之间均处理等待状态,该方式可以利用Java语言的线程同步锁定特性实现。同步区的操作包括:事务过期检查、插入数据控制、删除数据控制、修改数据控制和灾难恢复。而非同步区的操作则不受限制,在任何时间均可以进行。非同步区的操作包括查询数据控制。最下层为存储数据的DataSet操作抽象层,在DataSet中保存有联机事务自身的状态信息,以及数据的事务状态属性信息。
在图形数据库中,联机事务的状态信息可以存储在名称为graphic_db_tx_def的DataSet中,该DataSet需要满足的数据结构可以如表1所示:
表1
而在图形数据库中每一个Node均有一个相对应的同名DataSet,数据之间的关系(Relation)信息则可以保存在名称为graphic_dbrelation_record_def的DataSet中。这些保存了Relation信息的DataSet中均缺省内置如表2所示的两列:
表2
参见图2所示,本发明实施例提供的基于OLTP的增加节点数据关系的方法,可以包括以下步骤:
步骤a,预先创建一个事务。
首先需要预先在联机事务处理系统中创建一个事务,然后才能进行数据的操作,例如增加节点数据关系。参见图3所示,所述步骤a在实际应用中可以包括以下步骤:
步骤a1:生成一个全局唯一的事务标识,并获取第一系统时间。
当接收到创建事务的API调用时,生成一个全局唯一的事务标识。例如生成的事务标识(ID)可以为:123abc。并且获取当前系统时间作为第一系统时间,例如第一系统时间可以为:1291739790803。
步骤a2:在事务的状态数据的数据集中插入一条事务记录,所述事务记录包括所述事务标识和第一系统时间。
例如可以在名称为graphic_db_tx_def的DataSet中插入一条新的记录作为事务记录,该事务记录的各个字段值可以如表3所示:
表3
tx_no |
is_commit |
is_rollback |
is_timeout |
start_time |
associate_node |
processing |
123abc |
-1 |
-1 |
-1 |
1291739790803 |
null |
-1 |
步骤b,接收所述事务的事务标识、源节点数据的标识以及目标节点数据的标识。
当应用程序调用需要插入数据的API时,将事务标识、源节点数据的标识以及目标节点数据的标识传给图形数据库。其中,所述源节点数据的标识以及目标节点数据的标识,用于表征所述源节点数据和目标节点数据的名称以及存储的位置信息。
步骤c,根据所述事务标识查找所述事务的事务记录。
在本步骤中,需要通过查询graphic_db_tx_def查找事务记录,假定事务标识为123abc,则查找到的事务记录如表3所示。
步骤d,根据所述事务记录判断所述事务是否有效,如果否,则执行步骤e,如果是,则执行步骤f。
在本步骤中,需要根据步骤c中查找事务记录的具体情况来判断所述事务是否有效。如果存在如下情形,则事务无效:
1)记录没有找到;
2)记录中is_commit的值为1,说明事务已提交;
3)记录中is_rollback的值为1,说明事务已回滚;
4)记录中is_timeout的值为1,说明事务已过期。
如果事务无效,则执行步骤e;相反,如果能够查找到所述事务记录,且该事务记录的具体情况如表3中所示,则说明该事务有效,执行步骤f。
步骤e,结束此次增加节点数据关系的操作。
步骤f,根据所述源节点数据的标识以及目标节点数据的标识,分别获取所述源节点数据记录与目标节点数据记录。
在确认事务有效后,需要进一步判断所述源节点数据和目标节点数据是否被其它事务锁定,因此首先需要根据所述源节点数据的标识以及目标节点数据的标识,分别获取所述源节点数据记录与目标节点数据记录。其中所述源节点数据记录与目标节点数据记录的格式如表2所示。
步骤g,根据所述源节点数据记录与目标节点数据记录,判断所述源节点数据和目标节点数据是否被其它事务锁定,如果是,则执行步骤h,如果否,则执行步骤i。
根据获取的所述源节点数据记录与目标节点数据记录来对数据进行检查,如果有任何一条记录列dirty的值为-1,且列tx_no的值既不为空也不等于当前事务编号,则意味着该条数据已被其它事务锁定。
步骤h,等待预设时长。
在确定所述源节点数据和目标节点数据被其它事务锁定后,调用操作逻辑的线程会休眠预设时长,例如可以是10毫秒。
步骤h1,判断所述事务是否超期,如果是,则执行步骤e,如果否,则返回步骤d。
调用操作逻辑的线程会休眠预设时长后,需要继续判断所述事务是否超期。具体的判断过程是用当前系统的时间减去事务记录中start_time列的值,与预设阈值进行比较,如果值大于预设阈值,则认为该事务超期,执行步骤e,即结束此次增加节点数据关系的操作;如果小于等于所述预设阈值,则认为该事务不超期,返回步骤d,再次判断该事务是否有效。其中,所述阈值可以为30000毫秒(30秒)。
步骤i,锁定所述事务记录,以确定所述事务被本次增加节点数据关系的操作所独占。
在确定所述事务有效,且所述源节点数据和目标节点数据没有被其它事务锁定时,则将该事务记录的processing列的值置为1,以确定所述事务被本次增加节点数据关系的操作所独占,锁定后的事务记录如表4所示:
表4
tx_no |
is_commit |
is_rollback |
is_timeout |
Start_time |
associate_node |
processing |
123abc |
-1 |
-1 |
-1 |
1291739790803 |
null |
1 |
步骤j,满足预设条件时,将所述源节点数据的标识以及目标节点数据的标识,添加到所述事务记录中,建立所述源节点数据和目标节点数据的关系,生成关系记录,并将所述源节点数据和目标节点数据标记为脏数据。
其中所述预设条件在实际应用当中可以是:所述源节点数据和目标节点数据不存在关系记录。
当满足上述预设条件时,将本次增加节点数据关系操作涉及的Node的名称增加到事务记录中。假定在事务标识123abc对应的事务记录中,应用程序调用API需要将本次增加节点数据关系操作涉及的Node的名称,即源节点Customer1的名称和目标节点的名称Customer2,赋予associate_node;则对应的事务记录中的信息如表5所示:
表5
需要说明的是,当在相同的事务中,如果涉及多个Node时,则将多个Node的名称以逗号分隔。
在将本次增加节点数据关系操作涉及的Node的名称增加到事务记录中后,就可以建立源节点数据和目标节点数据的关系,生成关系记录,并将源节点数据和目标节点数据标记为脏数据。标记脏数据的具体过程可以是:将源节点数据的数据记录和目标节点数据的数据记录中,“dirty”列的值设为1,表明所述源节点数据和目标节点数据为脏数据,然后再将“tx_no”列的值设为事务标识,在本实施例中即为“123abc”。
步骤k,解除对所述事务记录的锁定。
在增加了源节点数据和目标节点数据的关系、生成了关系记录后,需要解除对所述事务记录的锁定。具体可以先查询graphic_db_tx_def,如果事务标识为“123abc”,则将该条记录的processing列的值置为“-1”,此时的当前事务记录可以如表6所示:
表6
解锁事务记录之后,后续在该事务下如果再有其它的增加节点数据关系的操作,就可以继续执行。
此外,需要说明的是,如果在锁定所述事务后,不满足预设条件,即所述源节点数据和目标节点数据存在关系记录时,需要进一步判断所述关系记录是否被删除,如果是,则更新所述关系记录的状态,然后解除对所述事务记录的锁定;如果否,则直接解除对所述事务记录的锁定。
在实际应用中,本实施例可以保证在基于图形数据库的联机事务处理系统中增加节点数据关系时,可以解决现有技术中存在冲突以及冲突导致的数据库中数据不完整的技术问题,因为在进行增加节点数据关系的操作时,在确定事务有效,且源节点数据和目标节点数据没有被其它事务占用时,会对事务记录进行锁定,此时即便有其他的增加节点数据关系的操作,也会处于等待状态。因此,本实施例所公开的增加节点数据关系的方法,能够保证数据的完整性。
参考图4,示出了本发明的一种基于OLTP的增加节点数据关系的方法实施例2的流程图,本实施例可以包括以下步骤:
步骤a,预先创建一个事务。
步骤b,接收所述事务的事务标识、源节点数据的标识以及目标节点数据的标识。
步骤c,根据所述事务标识查找所述事务的事务记录。
步骤d,根据所述事务记录判断所述事务是否有效,如果否,则执行步骤e,如果是,则执行步骤f。
步骤e,结束此次增加节点数据关系的操作。
步骤f,根据所述源节点数据的标识以及目标节点数据的标识,分别获取所述源节点数据记录与目标节点数据记录。
步骤g,根据所述源节点数据记录与目标节点数据记录,判断所述源节点数据和目标节点数据是否被其它事务锁定,如果是,则执行步骤h,如果否,则执行步骤i。
步骤h,等待预设时长。
步骤h1,判断所述事务是否超期,如果是,则执行步骤e,如果否,则返回步骤d。
步骤i,锁定所述事务记录,以确定所述事务被本次增加节点数据关系的操作所独占。
步骤j,满足预设条件时,将所述源节点数据的标识以及目标节点数据的标识,添加到所述事务记录中,建立所述源节点数据和目标节点数据的关系,生成关系记录,并将所述源节点数据和目标节点数据标记为脏数据。
步骤j1,将所述第一系统时间更新为生成关系记录完毕时的第二系统时间。
步骤k,解除对所述事务记录的锁定。
其中,步骤a-j,k在上一个实施例已经详细说明,在此不再赘述。
在本实施例中,当数据插入完毕后,还包括更新事务记录的时间戳的步骤j1,即将最新的系统时间更新到所属事务记录的start_time列中。假设事务的编号为123abc,当前的系统时间为1291739798888,则更新后的事务记录可以如表7所示:
表7
参考图5,示出了本发明的一种基于OLTP的增加节点数据关系的方法实施例3的流程图,本实施例是在步骤k之后才可以执行的,本实施例所介绍的方法为联机事务处理系统中事务的提交方法,本实施例在步骤步骤k之后,还可以包括以下步骤:
步骤k1,将所述事务记录中的提交标识设置为有效。
在事务需要进行提交时,对于增加节点数据关系的事务提交,应用程序首先调用API接口,将事务标识传给图形数据库。
需要说明的是,在步骤k1之前,还可以首先判断事务是否有效,如果事务无效,则结束本次事务提交过程,还可以返回错误信息。如果事务有效再触发步骤k1的执行。其中,事务是否有效的判断方式在实施例1中已经进行了介绍,在此不再赘述。
本步骤可以理解为标记事务提交状态。查询graphic_db_tx_def,假定所属事务标识为123abc,将该条事务记录中is_commit列的值置为1,如表8所示:
表8
步骤k2,分别将所述源节点数据记录与目标节点数据记录标记为不从属于所述事务,并分别将所述源节点数据记录与目标节点数据记录中的字段值更新为空。
在本步骤需要将源节点数据记录与目标节点数据记录标识为不从属于一个新事务,即更改源节点数据记录与目标节点数据记录的脏数据状态,具体可以为查询graphic_db_tx_def,如果事务记录中的associate_node的字段值为Customer1,Customer2,则继续查询名为名称为为Customer1和Customer2的DataSet,将DataSet中的数据记录的“dirty”列的值设置为-1;然后将所述数据记录“tx_no”的值设为null。
步骤k3,删除所述事务记录。
将本次提交事务的记录从名称为graphic_db_tx_def的DataSet中删除,完成事务的提交操作。
需要说明的是,如果事务提交不成功,则会执行事务回滚过程,参考图6,示出了本发明的一种基于OLTP的增加节点数据关系的方法实施例4的流程图,本实施例是在步骤k之后才可以执行的,本实施例所介绍的方法也为联机事务处理系统中事务回滚方法,本实施例在步骤k之后,本实施例可以包括以下步骤:
步骤ka,将所述事务记录中的回滚标识设置为有效。
在应用程序调用API之后,联机事务处理系统将事务标识传给图形数据库。
图形数据库具体可以首先判断事务是否有效,如果事务无效,则结束本次事务回滚操作,还可以返回错误信息。
如果事务有效则将所述事务记录中的回滚标识设置为有效,具体要查询graphic_db_tx_def,假定所属事务标识为123abc,则将事务记录中is_rollback列的值置为1,如表9所示:
表9
步骤kb,删除所述关系记录和所述脏数据。
在本步骤中需要将增加的节点数据关系的关系记录和脏数据删除。通过查询graphic_db_tx_def,获得事务记录中的列associate_node的值,假设该列的值为Customer1,Customer2,则继续查询标识为Customer1和Customer2的DataSet,将tx_no的值等于所述事务编号、且dirty的值为1的数据删除。
步骤kc,删除所述事务记录。
最后再将事务记录也进行删除,完成事务的回滚操作。
需要说明的是,对于前述的各方法实施例,为了简单描述,故将其都表述为一系列的动作组合,但是本领域技术人员应该知悉,本发明并不受所描述的动作顺序的限制,因为依据本发明,某些步骤可以采用其他顺序或者同时进行。其次,本领域技术人员也应该知悉,说明书中所描述的实施例均属于优选实施例,所涉及的动作和模块并不一定是本发明所必须的。
参考图7,示出了本发明的一种基于OLTP的增加节点数据关系的系统的结构示意图,可以包括以下单元:
创建单元701,用于预先创建一个事务。
接收单元702,用于接收所述事务的事务标识、源节点数据的标识以及目标节点数据的标识。
第一查找单元703,用于根据所述事务标识查找所述事务的事务记录。
第一判断单元704,用于根据所述事务记录判断所述事务是否有效。
终止操作单元705,用于当所述第一判断单元703的判断结果为否时,结束此次增加节点数据关系的操作。
第二查找单元706,用于当所述第一判断单元703的判断结果为是时,根据所述源节点数据的标识以及目标节点数据的标识,分别获取所述源节点数据记录与目标节点数据记录。
第二判断单元707,根据所述源节点数据记录与目标节点数据记录,判断所述源节点数据和目标节点数据是否被其它事务锁定。
延迟单元708,用于当所述第二判断单元707的判断结果为是时,等待预设时长。
第三判断单元709,用于在所述延迟单元708等待预设时长后,判断所述事务是否超期,如果是,则返回所述终止操作单元705,如果否,则返回所述第一判断单元704。
锁定单元710,用于当所述第二判断单元707的判断结果为否时,锁定所述事务记录,以确定所述事务被本次增加节点数据关系的操作所独占。
数据关系添加单元711,用于满足预设条件时,将所述源节点数据的标识以及目标节点数据的标识,添加到所述事务记录中,建立所述源节点数据和目标节点数据的关系,生成关系记录,并将所述源节点数据和目标节点数据标记为脏数据。
解锁单元712,用于解除对所述事务记录的锁定。
如果在增加节点数据关系之后,需要将事务提交,参考图8,基于OLTP的增加节点数据关系的系统还应该包括以下单元:
提交标识设置单元713,用于将所述事务记录中的提交标识设置为有效。
脏数据处理单元714,用于分别将所述源节点数据记录与目标节点数据记录标记为不从属于所述事务,并分别将所述源节点数据记录与目标节点数据记录中的字段值更新为空。
第一删除单元715,用于删除所述事务记录。
如果在增加节点数据关系之后,需要执行事务回滚过程,参考图9,基于OLTP的增加节点数据关系的系统还应该包括以下单元:
回滚标识设置单元716,用于将所述事务记录中的回滚标识设置为有效。
第二删除单元717,用于删除所述关系记录、脏数据以及事务记录。
需要说明的是,本说明书中的各个实施例均采用递进的方式描述,每个实施例重点说明的都是与其他实施例的不同之处,各个实施例之间相同相似的部分互相参见即可。对于系统类实施例而言,由于其与方法实施例基本相似,所以描述的比较简单,相关之处参见方法实施例的部分说明即可。
需要说明的是,在本文中,诸如第一和第二等之类的关系术语仅仅用来将一个实体或者操作与另一个实体或操作区分开来,而不一定要求或者暗示这些实体或操作之间存在任何这种实际的关系或者顺序。而且,术语“包括”、“包含”或者其任何其他变体意在涵盖非排他性的包含,从而使得包括一系列要素的过程、方法、物品或者设备不仅包括那些要素,而且还包括没有明确列出的其他要素,或者是还包括为这种过程、方法、物品或者设备所固有的要素。在没有更多限制的情况下,由语句“包括一个......”限定的要素,并不排除在包括所述要素的过程、方法、物品或者设备中还存在另外的相同要素。
本文中应用了具体个例对本发明的原理及实施方式进行了阐述,以上实施例的说明只是用于帮助理解本发明的方法及其核心思想;同时,对于本领域的一般技术人员,依据本发明的思想,在具体实施方式及应用范围上均会有改变之处,综上所述,本说明书内容不应理解为对本发明的限制。