数据操作方法、装置和计算机设备与流程

文档序号:13673544阅读:167来源:国知局

本申请涉及计算机应用技术领域,尤其涉及一种数据操作方法、装置和计算机设备。



背景技术:

在软件系统中,树形依存关系对象的应用极为广泛。诸如机构层级、组织层级和文件系统层级等,均可以描述为树形依存关系对象。例如:第一集团、第一事业本部和第一事业部,第一事业部依存于第一集团和第一事业本部,如果第一集团不存在了,那么也就不存在第一事业部了。

在软件系统中,并发操作是非常常见的。如果不对并发操作加以控制,会使得获取的数据出现错乱的情况。例如:一个操作为统计第一集团的员工总数,一个操作为第一事业部增加新员工,在增加新员工的同时统计第一集团的员工总数,会使得统计获得的员工总数不正确。

现有相关技术中,一种方案为将系统中所有用到的操作和所要操作的对象绑定后进行分类,并配置并发规则,这种解决方案缺乏灵活性,在系统需要增减业务时,需要变更系统实现,成本较高,不利于维护。

另一种方案是将操作加上粗粒度的锁,例如分支锁,每次操作将一个分支锁住,这样只有当操作分别属于两个分支时,才可以并发,因此这种方案的并发的控制粒度较粗,虽然解决了并发问题,但是并发效率较低。



技术实现要素:

本申请旨在至少在一定程度上解决相关技术中的技术问题之一。

为此,本申请的第一个目的在于提出一种数据操作方法,以实现通过关系锁和结构锁灵活地控制数据并发操作,并且可以以较细的控制粒度对并发操作进行控制,提升了数据操作的并发效率。

本申请的第二个目的在于提出一种数据操作装置。

本申请的第三个目的在于提出一种计算机设备。

本申请的第四个目的在于提出一种非临时性计算机可读存储介质。

本申请的第五个目的在于提出一种计算机程序产品。

为达上述目的,本申请第一方面实施例提出一种数据操作方法,包括:接收数据操作请求;申请对待操作对象的父对象添加关系锁之后,申请对所述待操作对象添加结构锁;根据所述数据操作请求对所述待操作对象进行数据操作。

本申请实施例的数据操作方法中,接收数据操作请求,在申请对待操作对象的父对象添加关系锁之后,申请对上述待操作对象添加结构锁,然后根据上述数据操作请求对上述待操作对象进行数据操作,从而可以实现通过关系锁和结构锁灵活地控制数据并发操作,并且可以以较细的控制粒度对并发操作进行控制,提升了数据操作的并发效率。

为达上述目的,本申请第二方面实施例提出了一种数据操作装置,包括:接收模块,用于接收数据操作请求;申请模块,用于申请对待操作对象的父对象添加关系锁之后,申请对所述待操作对象添加结构锁;数据操作模块,用于根据所述接收模块接收的数据操作请求对所述待操作对象进行数据操作。

本申请实施例的数据操作装置中,接收模块接收数据操作请求,在申请模块申请对待操作对象的父对象添加关系锁之后,申请对上述待操作对象添加结构锁,然后数据操作模块根据上述数据操作请求对上述待操作对象进行数据操作,从而可以实现通过关系锁和结构锁灵活地控制数据并发操作,并且可以以较细的控制粒度对并发操作进行控制,提升了数据操作的并发效率。

为达上述目的,本申请第三方面实施例提出了一种计算机设备,包括存储器、处理器及存储在所述存储器上并可在所述处理器上运行的计算机程序,所述处理器执行所述计算机程序时,实现如上所述的方法。

为了实现上述目的,本申请第四方面实施例提出了一种非临时性计算机可读存储介质,其上存储有计算机程序,所述计算机程序被处理器执行时实现如上所述的方法。

为了实现上述目的,本申请第五方面实施例提出了一种计算机程序产品,当所述计算机程序产品中的指令处理器执行时,实现如上所述的方法。

本申请附加的方面和优点将在下面的描述中部分给出,部分将从下面的描述中变得明显,或通过本申请的实践了解到。

附图说明

本申请上述的和/或附加的方面和优点从下面结合附图对实施例的描述中将变得明显和容易理解,其中:

图1为本申请数据操作方法一个实施例的流程图;

图2为本申请数据操作方法中关系锁一个实施例的示意图;

图3为本申请数据操作方法中结构锁一个实施例的示意图;

图4为本申请数据操作方法中关系锁和结构锁的关系一个实施例的示意图;

图5为本申请数据操作方法中关系锁和结构锁的关系另一个实施例的示意图;

图6为本申请数据操作方法中关系锁和结构锁的关系再一个实施例的示意图;

图7为本申请数据操作方法中关系锁和结构锁的关系再一个实施例的示意图;

图8(a)~图8(b)为本申请数据操作方法中的数据并发操作一个实施例的示意图;

图9为本申请数据操作方法另一个实施例的流程图;

图10为本申请数据操作方法中添加关系锁一个实施例的示意图;

图11为本申请数据操作方法中读计数一个实施例的示意图;

图12为本申请数据操作方法中等待申请结构读锁一个实施例的示意图;

图13为本申请数据操作方法再一个实施例的流程图;

图14为本申请数据操作方法中写计数一个实施例的示意图;

图15为本申请数据操作方法中等待申请关系锁一个实施例的示意图;

图16为本申请数据操作方法中计数同步锁公平模式一个实施例的示意图;

图17为本申请数据操作方法中计数同步锁非公平模式一个实施例的示意图;

图18为本申请数据操作装置一个实施例的结构示意图;

图19为本申请数据操作装置另一个实施例的结构示意图;

图20为本申请计算机设备一个实施例的结构示意图。

具体实施方式

下面详细描述本申请的实施例,所述实施例的示例在附图中示出,其中自始至终相同或类似的标号表示相同或类似的元件或具有相同或类似功能的元件。下面通过参考附图描述的实施例是示例性的,旨在用于解释本申请,而不能理解为对本申请的限制。

图1为本申请数据操作方法一个实施例的流程图,如图1所示,上述数据操作方法可以包括:

步骤101,接收数据操作请求。

步骤102,申请对待操作对象的父对象添加关系锁之后,申请对上述待操作对象添加结构锁。

其中,上述关系锁为保持依存对象关系的锁,在对一个对象加关系锁之后,从根对象到加锁对象的依存关系不能改变,图2为本申请数据操作方法中关系锁一个实施例的示意图,如图2所示,当对第一事业本部加上关系锁时,从第一集团到第一事业本部的依存关系不能改变,即第一集团和第一事业本部这两个对象不能修改,不能删除,但是可以新建分支。在图2中,以虚线方框表示对第一集团和第一事业本部添加的关系锁。

上述结构锁为保持对象及其分支的依存关系和内容的锁。上述结构锁可以包括结构写锁和结构读锁,当对一个对象加结构写锁时,加结构写锁的对象的内容可以被修改,但加结构写锁的对象和其分支上所有对象的依存关系不能被修改和读取,加结构写锁的对象所在分支上所有对象的内容不能被修改和读取。当对一个对象加结构读锁时,加结构读锁的对象本身和其分支上所有的对象关系和内容不可以被修改,但是可以被读取。

图3为本申请数据操作方法中结构锁一个实施例的示意图,如图3所示,当对第一事业本部加上结构锁时,意味着第一事业本部,第一事业部和第二事业部的依存关系和内容均被锁住。图3中,点划线方框表示结构写锁。

步骤103,根据上述数据操作请求对上述待操作对象进行数据操作。

本实施例的一种实现方式中,上述数据操作请求可以为读操作请求,上述结构锁包括结构读锁;这样步骤102可以为:申请对待操作对象的父对象添加关系锁之后,申请对上述待操作对象添加结构读锁;步骤103可以为:根据上述读操作请求对所述待操作对象进行数据读取操作。

本实施例的另一种实现方式中,上述数据操作请求可以为写操作请求,上述结构锁包括结构写锁;这样,步骤102可以为:申请对待操作对象的父对象添加关系锁之后,申请对上述待操作对象添加结构写锁;步骤103可以为:根据上述写操作请求对上述待操作对象进行数据写入操作。

本实施例中,上述关系锁之间、关系锁和结构读锁之间以及结构读锁之间是可重入的;上述可重入包括对相同的对象进行重复加锁;和/或,可重入的锁的范围内包括相同的对象。

图4为本申请数据操作方法中关系锁和结构锁的关系一个实施例的示意图,如图4所示,第一事业本部可以申请添加关系锁,这样第一集团和第一事业本部均添加关系锁,然后如果需要对第一事业本部进行读数据操作,则需要对第一集团添加关系锁,对第一事业本部加结构读锁,这样第一事业本部所在分支上的第一事业部和第二事业部均被添加结构读锁。从图4中可以看出,第一集团上加了两把关系锁,第一事业本部上加了一把关系锁和一把结构读锁,这就说明,可重入的锁,可以对相同的对象加锁。图4中,虚线方框表示关系锁,点划线方框表示结构写锁,双点划线方框表示结构读锁,下同,不再赘述。

图5为本申请数据操作方法中关系锁和结构锁的关系另一个实施例的示意图,如图5所示,对第一事业部进行数据读取操作时,需要先申请对第一集团和第一事业本部添加关系锁,然后申请对第一事业部添加结构读锁;接下来,如果需要对第一事业本部进行数据读取操作,需要先申请对第一集团添加关系锁,然后对第一事业本部添加结构读锁,第一事业本部加结构读锁之后,第一事业本部所在分支的第一事业部和第二事业部也添加上结构读锁。从图5可以看出,第一集团这一对象上添加了两把关系锁,第一事业本部这一对象上添加了一把关系锁和一把结构读锁,第一事业部这一对象上添加了两把结构读锁,这就说明,可重入的锁,锁的范围内可以含有相同的对象。

本实施例中,结构写锁和关系锁之间、结构写锁和结构读锁以及结构写锁之间是互斥的;其中,互斥的锁不能锁同一个对象;和/或,互斥的锁的范围内不能包括相同的对象。

图6为本申请数据操作方法中关系锁和结构锁的关系再一个实施例的示意图,如图6所示,第一事业本部可以申请添加关系锁,这样第一集团和第一事业本部均添加关系锁,然后如果需要对第一事业本部进行写数据操作,则需要对第一集团添加关系锁,对第一事业本部添加结构写锁,但是由于第一事业本部已经被添加关系锁,而结构写锁与关系锁互斥,互斥的锁不能同时锁同一个对象,因此第一事业本部添加结构写锁失败。

图7为本申请数据操作方法中关系锁和结构锁的关系再一个实施例的示意图,如图7所示,对第一事业部进行数据写入操作时,需要先申请对第一集团和第一事业本部添加关系锁,然后申请对第一事业部添加结构写锁;接下来,如果需要对第一事业本部进行数据读取操作,需要先申请对第一集团添加关系锁,然后对第一事业本部添加结构读锁,第一事业本部加结构读锁之后,第一事业本部所在分支的第一事业部和第二事业部也需要添加上结构读锁。从图7可以看出,由于第一事业部已经添加结构写锁,结构写锁和结构读锁互斥,而互斥的锁,锁的范围内不能含有相同的对象,因此第一事业部添加结构读锁失败。

现在假设系统中只有三个业务:统计第一集团人数,统计第二事业本部人数,第一事业部增加新员工,通过本申请图4~图7所示实施例描述的关系锁与结构锁的关系可以看出,在统计第一集团人数的同时,可以进行统计第二事业本部人数的操作,而在统计第一集团人数的同时,不能进行增加第一事业部新员工的操作,如图8(a)和图8(b)所示,图8(a)~图8(b)为本申请数据操作方法中的数据并发操作一个实施例的示意图。

如图8(a)所示,统计第一集团人数是对第一集团这一对象进行数据读取操作,因此第一集团及其所包含分支上的所有对象都被添加结构读锁,而统计第二事业本部人数的操作是对第二事业本部这一对象进行数据读取操作,需要对第一集团添加关系锁,对第二事业本部添加结构读锁,这时,第二事业本部所在分支所包含的对象第三事业部也需要添加结构读锁,由于第一集团、第二事业本部和第三事业部已经被添加结构读锁,而关系锁和结构读锁之间,结构读锁之间均是可重入的关系,因此,对第一集团添加关系锁,对第二事业本部和第三事业部添加结构读锁可以添加成功,这就说明,在统计第一集团人数的同时,可以进行统计第二事业本部人数的操作。

如图8(b)所示,统计第一集团人数是对第一集团这一对象进行数据读取操作,因此第一集团及其所包含分支上的所有对象都被添加结构读锁,而增加第一事业部新员工的操作是对第一事业部这一对象进行数据写入操作,需要对第一事业本部和第一集团添加关系锁,对第一事业部添加结构写锁,由于第一事业部已经被添加结构读锁,而结构读锁和结构写锁之间是互斥的关系,因此第一事业部添加结构写锁失败,这就说明,在统计第一集团人数的同时,不能进行增加第一事业部新员工的操作。

上述数据操作方法可以解决相同对象的并发读写操作、不同对象的并发读操作、不同对象的并发写操作和一部分不同对象的并发读写操作。但在相同分支下,父对象读,子对象写的情况无法解决。也就是说,子对象已经加上结构写锁,但父对象依然可以加上结构读锁,或者父对象已经加上了结构读锁,子对象依然可以加上结构写锁的并发操作的矛盾无法解决。

下面描述上述情况的具体解决方法。

图9为本申请数据操作方法另一个实施例的流程图,本申请对图1所示实施例中,申请对待操作对象的父对象添加关系锁之后,申请对上述待操作对象添加结构读锁的具体实施方式进行介绍,如图9所示,可以包括:

步骤901,申请对待操作对象的父对象添加关系锁。

本实施例中,申请对待操作对象的父对象添加关系锁可以为:申请对上述待操作对象所在分支的每一级父对象添加结构读锁。

具体地,关系锁是由一系列对象的关系读锁组成的,如图10所示,图10为本申请数据操作方法中添加关系锁一个实施例的示意图,在申请c分支下的d的关系锁时,按照先后顺序,需要依次申请对a添加结构读锁,对a/c添加结构读锁,对a/c/d添加结构读锁。而在释放关系锁时为倒序,即释放关系锁时的顺序与添加关系锁时的顺序完全相反。

步骤902,判断上述待操作对象的写计数是否为第一数值;如果是,则执行步骤903;如果上述待操作对象的写计数不是第一数值,则执行步骤904。

其中,第一数值的大小可以在具体实现时,根据系统性能和/或实现需求等自行设定,本实施例对上述第一数值的大小不作限定,本实施例以第一数值为“0”为例进行说明。

步骤903,申请对上述待操作对象添加结构读锁,并将上述待操作对象的读计数加上第二数值。

其中,第二数值的大小可以在具体实现时,根据系统性能和/或实现需求等自行设定,本实施例对上述第二数值的大小不作限定,本实施例以第二数值为“1”为例进行说明。

图11为本申请数据操作方法中读计数一个实施例的示意图,如图11所示,需要对对象e进行数据读取操作,先对对象a和对象c添加关系锁,然后判断对象e上的写计数是否为“0”,图11中,对象e的写计数为“0”,因此对对象e添加结构读锁,然后将对象e的读计数加“1”,这样,对象e的读计数变为“1”,写计数仍为“0”,即(r1,w0)。同理,需要对对象f进行数据读取操作,先对对象a添加关系锁,然后判断对象f上的写计数是否为“0”,图11中,对象f的写计数为“0”,因此对对象f添加结构读锁,然后将对象f的读计数加“1”,这样,对象f的读计数变为“1”,写计数仍为“0”,即(r1,w0)。

步骤904,在上述待操作对象上等待申请结构读锁。

另外,本实施例中,在对上述待操作对象的数据写入操作完成之后,释放上述待操作对象上添加的结构写锁,然后需要将上述待操作对象所在分支上的每一级父对象的写计数减去第二数值,判断减去第二数值之后,是否存在写计数为第一数值的父对象,如果存在,则唤醒等待在写计数为第一数值的父对象上的申请结构读锁的操作。

图12为本申请数据操作方法中等待申请结构读锁一个实施例的示意图,如图12所示,已经申请到对象e的结构写锁,这时,对象a和对象c上已经添加关系锁,并且对象a和对象c的读计数均为“0”,写计数均为“1”。这时,需要对对象c进行数据读取操作,先申请对对象a添加关系锁,然后判断对象c的写计数是否为“0”,图12中,对象c的写计数为“1”,因此需要在对象c上等待申请结构读锁,也就是说,需要等待对象c上的写计数变为“0”,再唤醒等待在对象c上的申请结构读锁的操作。具体地,在对对象e的数据写入操作完成之后,对象e上的结构写锁释放,然后需要将对象e所在分支上的父对象a和c的写计数减“1”,图12中,写计数减“1”之后,对象c上的写计数变为“0”,等待在对象c上的申请结构读锁的操作将被唤醒。

图13为本申请数据操作方法再一个实施例的流程图,本申请对图1所示实施例中,申请对待操作对象的父对象添加关系锁之后,申请对上述待操作对象添加结构写锁的具体实施方式进行介绍,如图13所示,可以包括:

步骤1301,判断上述待操作对象所在分支的每一级父对象中是否存在读计数为第一数值的父对象。

如果是,即上述待操作对象所在分支的每一级父对象中存在读计数为第一数值的父对象,则执行步骤1302;如果否,即上述待操作对象所在分支的每一级父对象中存在读计数不是第一数值的父对象,则执行步骤1304。

其中,第一数值的大小可以在具体实现时,根据系统性能和/或实现需求等自行设定,本实施例对上述第一数值的大小不作限定,本实施例以第一数值为“0”为例进行说明。

步骤1302,申请对读计数为第一数值的父对象添加关系锁,并将添加关系锁的父对象的写计数加上第二数值。

其中,第二数值的大小可以在具体实现时,根据系统性能和/或实现需求等自行设定,本实施例对上述第二数值的大小不作限定,本实施例以第二数值为“1”为例进行说明。

步骤1303,在上述待操作对象所在分支的每一级父对象均添加上述关系锁之后,申请对上述待操作对象添加结构写锁。

图14为本申请数据操作方法中写计数一个实施例的示意图,如图14所示,需要对对象e进行数据写入操作,这时首先需要判断对象a和对象c的读计数是否为“0”,本实施例中,对象a和对象c的读计数均为“0”,这时,可以对对象a和对象c添加关系锁,然后将对象a和对象c的写计数加“1”,这时对象a的读计数为“0”,写计数为“1”;对象c的读计数为“0”,写计数为“1”,即(r0,w1)。同理,需要对对象f进行数据写入操作,需要先判断对象a的读计数是否为“0”,本实施例中,对象a的读计数为“0”,这时,可以对对象a添加关系锁,然后将对象a的写计数加“1”,这时对象a的读计数为“0”,写计数将变为“2”,即(r0,w2)。

步骤1304,在读计数不是第一数值的父对象上等待申请关系锁。

另外,本实施例中,在对上述待操作对象的数据读取操作完成之后,释放上述待操作对象上添加的结构读锁,然后可以将上述待操作对象的读计数减去第二数值,如果减去第二数值之后,上述待操作对象的读计数为第一数值,则唤醒等待在读计数为第一数值的对象上的申请关系锁的操作。

图15为本申请数据操作方法中等待申请关系锁一个实施例的示意图,如图15所示,已经申请到对象c的结构读锁,这时,对象a上添加关系锁,对象c上添加结构读锁,并且对象a的读计数为“0”,写计数为“0”,对象c的读计数为“1”,写计数为“0”。这时,需要对对象e进行数据写入操作,先判断对象a和对象c的读计数是否为“0”,对象a的读计数为“0”,对对象a添加关系锁,然后将对象a的写计数加“1”,这时对象a的读计数为“0”,写计数变为“1”,即(r0,w1)。由于对象c的读计数为“1”,因此需要在对象c上等待申请关系锁,也就是说,需要等待对象c上的读计数变为“0”,再唤醒等待在对象c上的申请关系锁的操作。具体地,在对对象c的数据读取操作完成之后,对象c上的结构读锁释放,然后需要将对象c的读计数减“1”,图15中,读计数减“1”之后,对象c上的读计数变为“0”,等待在对象c上的申请关系锁的操作将被唤醒。

通过本申请图9~图15所示实施例描述的方案,可以看出,一个对象上不可能存在读写计数同时不为0的情况。但是在实际高并发的环境下,是有可能出现这种情况的,原因在于,存在同时修改同一对象的读写计数的一瞬间。

在对待操作对象进行数据写入操作时,先判断读计数,之后改写计数,而在对待操作对象进行数据读取操作时,先判断写计数,之后改读计数,这样,在实际高并发的环境下,存在一瞬间读写计数都为0,判断都通过,读写计数同时加一的情况。

为了解决这个问题,本申请引入了计数同步锁,对对象上的判断计数和修改计数的操作加锁。具体地,每个对象在判断计数之前,需要加上计数同步锁,在修改计数之后,释放计数同步锁,这就相当于将两个计数操作锁住,解决了读写计数的并发问题。

在计数同步锁的一种实现方式中,在进行判断计数操作之前,对进行判断计数操作的对象添加计数同步锁,然后在对添加上述计数同步锁的对象进行计数修改操作之后,释放上述计数同步锁。

这是计数同步锁中的公平模式,具体地,如图16所示,图16为本申请数据操作方法中计数同步锁公平模式一个实施例的示意图,在公平模式中,对象c申请到了结构读锁x,这时对象a上添加关系锁,对象a上的读计数为“0”,写计数为“0”,即(r0,w0);对象c上的读计数为“1”,写计数为“0”,即(r1,w0)。

然后,对象e申请结构写锁y,此时y会持有计数同步锁,然后判断对象a和对象c的读计数是否为“0”,对象a的读计数为“0”,对对象a添加关系锁,并将对象a的写计数加“1”,这样对象a上的读计数和写计数变为(r0,w1)。由于对象c的读计数为“1”,因此申请结构写锁y的操作等待在对象c上,需要等待对象c的读计数变为“0”,这时,如果再想申请对象c的结构读锁z,则会等待在计数同步锁上。当x释放后,对象c的读计数减“1”,这时对象c上的读计数变为“0”,等待在对象c上的申请结构写锁y的操作会被唤醒,对象c被添加关系锁,并且对象c的写计数加“1”,对象c的读计数和写计数变为(r0,w1),对象e申请结构写锁y成功。在修改对象c上的计数之后,对象c上的计数同步锁释放,结构读锁z在获得同步计数锁后,会等待在对象c上,即等对象c上的写计数变为“0”之后,申请结构读锁z的操作会被唤醒。

在计数同步锁的另一种实现方式中,在进行判断计数操作之前,对进行判断计数操作的对象添加计数同步锁,如果在添加上述计数同步锁的对象上的关系锁或结构锁的申请操作需要等待,则释放上述计数同步锁,在上述关系锁或结构锁的申请操作被唤醒之后,再重新申请上述计数同步锁;如果在添加上述计数同步锁的对象上的关系锁或结构锁的申请操作不需要等待,则在对添加上述计数同步锁的对象进行计数修改操作之后,释放上述计数同步锁。

这是计数同步锁的非公平模式,具体地,如图17所示,图17为本申请数据操作方法中计数同步锁非公平模式一个实施例的示意图,在非公平模式中,对象c申请到了结构读锁x,这时对象a上添加关系锁,对象a上的读计数为“0”,写计数为“0”,即(r0,w0);对象c上的读计数为“1”,写计数为“0”,即(r1,w0)。

然后对象e申请结构写锁y,此时y会持有计数同步锁,然后判断对象a和对象c的读计数是否为“0”,对象a的读计数为“0”,对对象a添加关系锁,并将对象a的写计数加“1”,这样对象a上的读计数和写计数变为(r0,w1)。由于对象c的读计数为“1”,因此申请结构写锁y的操作等待在对象c上,需要等待对象c的读计数变为“0”,此时结构写锁y会释放计数同步锁;如果再想申请对象c的结构读锁z,则结构读锁z会获得计数同步锁,将对象a添加关系锁,判断对象c上的写计数是否为“0”,对象c的写计数为“0”,因此对象c添加结构读锁z成功,将对象c上的读计数加“1”,这时,对象c上的读计数和写计数变为(r2,w0)。那么申请结构写锁y的操作需要等待x和z都释放后才能获得计数同步锁,如图17所示,在此不再赘述。

图18为本申请数据操作装置一个实施例的结构示意图,本实施例中的数据操作装置可以实现本申请实施例提供的数据操作方法。如图18所示,上述数据操作装置可以包括:接收模块1801、申请模块1802和数据操作模块1803;

其中,接收模块1801,用于接收数据操作请求;

申请模块1802,用于申请对待操作对象的父对象添加关系锁之后,申请对所述待操作对象添加结构锁;其中,上述关系锁为保持依存对象关系的锁,在对一个对象加关系锁之后,从根对象到加锁对象的依存关系不能改变,如图2所示,当对第一事业本部加上关系锁时,从第一集团到第一事业本部的依存关系不能改变,即第一集团和第一事业本部这两个对象不能修改,不能删除,但是可以新建分支。

上述结构锁为保持对象及其分支的依存关系和内容的锁。上述结构锁可以包括结构写锁和结构读锁,当对一个对象加结构写锁时,加结构写锁的对象的内容可以被修改,但加结构写锁的对象和其分支上所有对象的依存关系不能被修改和读取,加结构写锁的对象所在分支上所有对象的内容不能被修改和读取。当对一个对象加结构读锁时,加结构读锁的对象本身和其分支上所有的对象关系和内容不可以被修改,但是可以被读取。

如图3所示,当对第一事业本部加上结构锁时,意味着第一事业本部,第一事业部和第二事业部的依存关系和内容均被锁住。

本实施例中,申请模块1802,具体用于申请对上述待操作对象所在分支的每一级父对象添加结构读锁。具体地,关系锁是由一系列对象的关系读锁组成的,如图10所示,在申请d的关系锁时,按照先后顺序,需要依次申请对a添加结构读锁,对a/c添加结构读锁,对a/c/d添加结构读锁。而在释放关系锁时为倒序,即释放关系锁时的顺序与添加关系锁时的顺序完全相反。

数据操作模块1803,用于根据接收模块1801接收的数据操作请求对上述待操作对象进行数据操作。

本实施例的一种实现方式中,上述数据操作请求可以为读操作请求,上述结构锁包括结构读锁;这样,申请模块1802,具体用于申请对待操作对象的父对象添加关系锁之后,申请对上述待操作对象添加结构读锁;数据操作模块1803,具体用于根据上述读操作请求对上述待操作对象进行数据读取操作。

本实施例的另一种实现方式中,上述数据操作请求可以为写操作请求,上述结构锁包括结构写锁;这样,申请模块1802,具体用于申请对待操作对象的父对象添加关系锁之后,申请对上述待操作对象添加结构写锁;数据操作模块1803,具体用于根据上述写操作请求对上述待操作对象进行数据写入操作。

本实施例中,上述关系锁之间、关系锁和结构读锁之间以及结构读锁之间是可重入的;上述可重入包括对相同的对象进行重复加锁;和/或,可重入的锁的范围内包括相同的对象。

如图4所示,第一事业本部可以申请添加关系锁,这样第一集团和第一事业本部均添加关系锁,然后如果需要对第一事业本部进行读数据操作,则需要对第一集团添加关系锁,对第一事业本部加结构读锁,这样第一事业本部所在分支上的第一事业部和第二事业部均被添加结构读锁。从图4中可以看出,第一集团上加了两把关系锁,第一事业本部上加了一把关系锁和一把结构读锁,这就说明,可重入的锁,可以对相同的对象加锁。

如图5所示,对第一事业部进行数据读取操作时,需要先申请对第一集团和第一事业本部添加关系锁,然后申请对第一事业部添加结构读锁;接下来,如果需要对第一事业本部进行数据读取操作,需要先申请对第一集团添加关系锁,然后对第一事业本部添加结构读锁,第一事业本部加结构读锁之后,第一事业本部所在分支的第一事业部和第二事业部也添加上结构读锁。从图5可以看出,第一集团这一对象上添加了两把关系锁,第一事业本部这一对象上添加了一把关系锁和一把结构读锁,第一事业部这一对象上添加了两把结构读锁,这就说明,可重入的锁,锁的范围内可以含有相同的对象。

本实施例中,结构写锁和关系锁之间、结构写锁和结构读锁以及结构写锁之间是互斥的;其中,互斥的锁不能锁同一个对象;和/或,互斥的锁的范围内不能包括相同的对象。

如图6所示,第一事业本部可以申请添加关系锁,这样第一集团和第一事业本部均添加关系锁,然后如果需要对第一事业本部进行写数据操作,则需要对第一集团添加关系锁,对第一事业本部添加结构写锁,但是由于第一事业本部已经被添加关系锁,而结构写锁与关系锁互斥,互斥的锁不能同时锁同一个对象,因此第一事业本部添加结构写锁失败。

如图7所示,对第一事业部进行数据写入操作时,需要先申请对第一集团和第一事业本部添加关系锁,然后申请对第一事业部添加结构写锁;接下来,如果需要对第一事业本部进行数据读取操作,需要先申请对第一集团添加关系锁,然后对第一事业本部添加结构读锁,第一事业本部加结构读锁之后,第一事业本部所在分支的第一事业部和第二事业部也需要添加上结构读锁。从图7可以看出,由于第一事业部已经添加结构写锁,结构写锁和结构读锁互斥,而互斥的锁,锁的范围内不能含有相同的对象,因此第一事业部添加结构读锁失败。

现在假设系统中只有三个业务:统计第一集团人数,统计第二事业本部人数,第一事业部增加新员工,通过本申请图4~图7所示实施例描述的关系锁与结构锁的关系可以看出,在统计第一集团人数的同时,可以进行统计第二事业本部人数的操作,而在统计第一集团人数的同时,不能进行增加第一事业部新员工的操作。

如图8(a)所示,统计第一集团人数是对第一集团这一对象进行数据读取操作,因此第一集团及其所包含分支上的所有对象都被添加结构读锁,而统计第二事业本部人数的操作是对第二事业本部这一对象进行数据读取操作,需要对第一集团添加关系锁,对第二事业本部添加结构读锁,这时,第二事业本部所在分支所包含的对象第三事业部也需要添加结构读锁,由于第一集团、第二事业本部和第三事业部已经被添加结构读锁,而关系锁和结构读锁之间,结构读锁之间均是可重入的关系,因此,对第一集团添加关系锁,对第二事业本部和第三事业部添加结构读锁可以添加成功,这就说明,在统计第一集团人数的同时,可以进行统计第二事业本部人数的操作。

如图8(b)所示,统计第一集团人数是对第一集团这一对象进行数据读取操作,因此第一集团及其所包含分支上的所有对象都被添加结构读锁,而增加第一事业部新员工的操作是对第一事业部这一对象进行数据写入操作,需要对第一事业本部和第一集团添加关系锁,对第一事业部添加结构写锁,由于第一事业部已经被添加结构读锁,而结构读锁和结构写锁之间是互斥的关系,因此第一事业部添加结构写锁失败,这就说明,在统计第一集团人数的同时,不能进行增加第一事业部新员工的操作。

上述数据操作装置可以解决相同对象的并发读写操作、不同对象的并发读操作、不同对象的并发写操作和一部分不同对象的并发读写操作。但在相同分支下,父对象读,子对象写的情况无法解决。也就是说,子对象已经加上结构写锁,但父对象依然可以加上结构读锁,或者父对象已经加上了结构读锁,子对象依然可以加上结构写锁的并发操作的矛盾无法解决。

图19为本申请数据操作装置另一个实施例的结构示意图,与图18所示的数据操作装置相比,不同之处在于,图19所示的数据操作装置中,申请模块1802可以包括:申请添加子模块18021、计数判断子模块18022和计数操作子模块18023;

其中,申请添加子模块18021,用于申请对待操作对象的父对象添加关系锁;本实施例中,申请添加子模块18021申请对待操作对象的父对象添加关系锁可以为:申请对上述待操作对象所在分支的每一级父对象添加结构读锁。

具体地,关系锁是由一系列对象的关系读锁组成的,如图10所示,在申请d的关系锁时,按照先后顺序,需要依次申请对a添加结构读锁,对a/c添加结构读锁,对a/c/d添加结构读锁。而在释放关系锁时为倒序,即释放关系锁时的顺序与添加关系锁时的顺序完全相反。

计数判断子模块18022,用于判断上述待操作对象的写计数是否为第一数值;其中,第一数值的大小可以在具体实现时,根据系统性能和/或实现需求等自行设定,本实施例对上述第一数值的大小不作限定,本实施例以第一数值为“0”为例进行说明。

申请添加子模块18021,还用于当计数判断子模块18022确定上述待操作对象的写计数为第一数值时,申请对上述待操作对象添加结构读锁;

计数操作子模块18023,用于将上述待操作对象的读计数加上第二数值。其中,第二数值的大小可以在具体实现时,根据系统性能和/或实现需求等自行设定,本实施例对上述第二数值的大小不作限定,本实施例以第二数值为“1”为例进行说明。

如图11所示,需要对对象e进行数据读取操作,申请添加子模块18021先对对象a和对象c添加关系锁,然后计数判断子模块18022判断对象e上的写计数是否为“0”,图11中,对象e的写计数为“0”,因此申请添加子模块18021对对象e添加结构读锁,然后计数操作子模块18023将对象e的读计数加“1”,这样,对象e的读计数变为“1”,写计数仍为“0”,即(r1,w0)。同理,需要对对象f进行数据读取操作,申请添加子模块18021先对对象a添加关系锁,然后计数判断子模块18022判断对象f上的写计数是否为“0”,图11中,对象f的写计数为“0”,因此申请添加子模块18021对对象f添加结构读锁,然后计数操作子模块18023将对象f的读计数加“1”,这样,对象f的读计数变为“1”,写计数仍为“0”,即(r1,w0)。

进一步,上述申请模块1802还可以包括:

申请等待子模块18024,用于当计数判断子模块18022确定上述待操作对象的写计数不是第一数值时,在上述待操作对象上等待申请结构读锁。

另外,上述数据操作装置还可以包括:释放模块1804;

释放模块1804,用于在对上述待操作对象的数据写入操作完成之后,释放上述待操作对象上添加的结构写锁;

这时,计数操作子模块18023,还用于将上述待操作对象所在分支上的每一级父对象的写计数减去第二数值;

计数判断子模块18022,还用于判断减去第二数值之后,是否存在写计数为第一数值的父对象;

申请模块1802还可以包括:申请唤醒子模块18025;

申请唤醒子模块18025,用于当计数判断子模块18022确定减去第二数值之后,存在写计数为第一数值的父对象时,唤醒等待在写计数为第一数值的父对象上的申请结构读锁的操作。

如图12所示,已经申请到对象e的结构写锁,这时,对象a和对象c上已经添加关系锁,并且对象a和对象c的读计数均为“0”,写计数均为“1”。这时,需要对对象c进行数据读取操作,申请添加子模块18021先申请对对象a添加关系锁,然后计数判断子模块18022判断对象c的写计数是否为“0”,图12中,对象c的写计数为“1”,因此申请等待子模块18024需要在对象c上等待申请结构读锁,也就是说,申请等待子模块18024需要等待对象c上的写计数变为“0”,再由申请唤醒子模块18025唤醒等待在对象c上的申请结构读锁的操作。具体地,在对对象e的数据写入操作完成之后,对象e上的结构写锁释放,然后计数操作子模块18023需要将对象e所在分支上的父对象a和c的写计数减“1”,图12中,写计数减“1”之后,对象c上的写计数变为“0”,等待在对象c上的申请结构读锁的操作将被申请唤醒子模块18025唤醒。

本实施例的另一种实现方式中,申请模块1802可以包括:申请添加子模块18021、计数判断子模块18022和计数操作子模块18023;

其中,计数判断子模块18022,用于判断上述待操作对象所在分支的每一级父对象中是否存在读计数为第一数值的父对象;其中,第一数值的大小可以在具体实现时,根据系统性能和/或实现需求等自行设定,本实施例对上述第一数值的大小不作限定,本实施例以第一数值为“0”为例进行说明。

申请添加子模块18021,用于当计数判断子模块18022确定上述待操作对象所在分支的每一级父对象中存在读计数为第一数值的父对象时,申请对读计数为第一数值的父对象添加关系锁;以及在上述待操作对象所在分支的每一级父对象均添加上述关系锁之后,申请对上述待操作对象添加结构写锁;

计数操作子模块18023,用于将添加关系锁的父对象的写计数加上第二数值。其中,第二数值的大小可以在具体实现时,根据系统性能和/或实现需求等自行设定,本实施例对上述第二数值的大小不作限定,本实施例以第二数值为“1”为例进行说明。

如图14所示,需要对对象e进行数据写入操作,这时计数判断子模块18022首先需要判断对象a和对象c的读计数是否为“0”,本实施例中,对象a和对象c的读计数均为“0”,这时,申请添加子模块18021可以对对象a和对象c添加关系锁,然后计数操作子模块18023将对象a和对象c的写计数加“1”,这时对象a的读计数为“0”,写计数为“1”;对象c的读计数为“0”,写计数为“1”,即(r0,w1)。同理,需要对对象f进行数据写入操作,计数判断子模块18022需要先判断对象a的读计数是否为“0”,本实施例中,对象a的读计数为“0”,这时,申请添加子模块18021可以对对象a添加关系锁,然后计数操作子模块18023将对象a的写计数加“1”,这时对象a的读计数为“0”,写计数将变为“2”,即(r0,w2)。

进一步地,上述申请模块1802还可以包括:

申请等待子模块18024,用于当计数判断子模块18022确定上述待操作对象所在分支的每一级父对象中存在读计数不是第一数值的父对象时,在读计数不是第一数值的父对象上等待申请关系锁。

另外,上述数据操作装置还可以包括:释放模块1804;

释放模块1804,用于在对上述待操作对象的数据读取操作完成之后,释放上述待操作对象上添加的结构读锁;

计数操作子模块18023,还用于将上述待操作对象的读计数减去第二数值;

上述申请模块1802还可以包括:

申请唤醒子模块18025,用于当减去第二数值之后,上述待操作对象的读计数为第一数值时,唤醒等待在读计数为第一数值的对象上的申请关系锁的操作。

如图15所示,已经申请到对象c的结构读锁,这时,对象a上添加关系锁,对象c上添加结构读锁,并且对象a的读计数为“0”,写计数为“0”,对象c的读计数为“1”,写计数为“0”。这时,需要对对象e进行数据写入操作,计数判断子模块18022先判断对象a和对象c的读计数是否为“0”,对象a的读计数为“0”,申请添加子模块18021对对象a添加关系锁,然后计数操作子模块将对象a的写计数加“1”,这时对象a的读计数为“0”,写计数变为“1”,即(r0,w1)。由于对象c的读计数为“1”,因此申请等待子模块18024需要在对象c上等待申请关系锁,也就是说,申请等待子模块18024需要等待对象c上的读计数变为“0”,再由申请唤醒子模块18025唤醒等待在对象c上的申请关系锁的操作。具体地,在对对象c的数据读取操作完成之后,对象c上的结构读锁释放,然后计数操作子模块18023需要将对象c的读计数减“1”,图15中,读计数减“1”之后,对象c上的读计数变为“0”,等待在对象c上的申请关系锁的操作将被申请唤醒子模块18025唤醒。

通过以上描述的方案,可以看出,一个对象上不可能存在读写计数同时不为0的情况。但是在实际高并发的环境下,是有可能出现这种情况的,原因在于,存在同时修改同一对象的读写计数的一瞬间。

在对待操作对象进行数据写入操作时,先由计数判断子模块18022判断读计数,之后计数操作子模块18023改写计数,而在对待操作对象进行数据读取操作时,先由计数判断子模块18022判断写计数,之后计数操作子模块18023改读计数,这样,在实际高并发的环境下,存在一瞬间读写计数都为0,判断都通过,读写计数同时加一的情况。

为了解决这个问题,本申请引入了计数同步锁,对对象上的判断计数和修改计数的操作加锁。具体地,每个对象在计数判断子模块18022判断计数之前,需要加上计数同步锁,在计数操作子模块18023修改计数之后,释放计数同步锁,这就相当于将两个计数操作锁住,解决了读写计数的并发问题。

在计数同步锁的一种实现方式中,上述数据操作装置还可以包括:释放模块1804;

申请添加子模块18021,还用于在计数判断子模块18022进行判断计数操作之前,对进行判断计数操作的对象添加计数同步锁;

释放模块1804,用于在计数操作子模块18023对添加上述计数同步锁的对象进行计数修改操作之后,释放上述计数同步锁。

这是计数同步锁中的公平模式,具体地,如图16所示,在公平模式中,对象c申请到了结构读锁x,这时对象a上添加关系锁,对象a上的读计数为“0”,写计数为“0”,即(r0,w0);对象c上的读计数为“1”,写计数为“0”,即(r1,w0)。

然后,对象e申请结构写锁y,此时y会持有计数同步锁,然后计数判断子模块18022判断对象a和对象c的读计数是否为“0”,对象a的读计数为“0”,申请添加子模块18021对对象a添加关系锁,计数操作子模块18023将对象a的写计数加“1”,这样对象a上的读计数和写计数变为(r0,w1)。由于对象c的读计数为“1”,因此申请结构写锁y的操作等待在对象c上,申请等待子模块18024需要等待对象c的读计数变为“0”,这时,如果再想申请对象c的结构读锁z,则会等待在计数同步锁上。当x释放后,对象c的读计数减“1”,这时对象c上的读计数变为“0”,等待在对象c上的申请结构写锁y的操作会被申请唤醒子模块18025唤醒,对象c被添加关系锁,并且对象c的写计数加“1”,对象c的读计数和写计数变为(r0,w1),对象e申请结构写锁y成功。在计数操作子模块18023修改对象c上的计数之后,对象c上的计数同步锁释放,结构读锁z在获得同步计数锁后,申请等待子模块18024会等待在对象c上,即等对象c上的写计数变为“0”之后,申请结构读锁z的操作会被申请唤醒子模块18025唤醒。

在计数同步锁的另一种实现方式中,上述数据操作装置还可以包括:释放模块1804;

申请添加子模块18021,还用于在计数判断子模块18022进行判断计数操作之前,对进行判断计数操作的对象添加计数同步锁;

释放模块1804,用于在添加上述计数同步锁的对象上的关系锁或结构锁的申请操作需要等待时,释放上述计数同步锁;以及在添加上述计数同步锁的对象上的关系锁或结构锁的申请操作不需要等待时,在对添加上述计数同步锁的对象进行计数修改操作之后,释放上述计数同步锁;

申请添加子模块18021,还用于在上述关系锁或结构锁的申请操作被唤醒之后,再重新申请上述计数同步锁。

这是计数同步锁的非公平模式,具体地,如图17所示,在非公平模式中,对象c申请到了结构读锁x,这时对象a上添加关系锁,对象a上的读计数为“0”,写计数为“0”,即(r0,w0);对象c上的读计数为“1”,写计数为“0”,即(r1,w0)。

然后对象e申请结构写锁y,此时y会持有计数同步锁,然后计数判断子模块18022判断对象a和对象c的读计数是否为“0”,对象a的读计数为“0”,申请添加子模块18021对对象a添加关系锁,计数操作子模块18023将对象a的写计数加“1”,这样对象a上的读计数和写计数变为(r0,w1)。由于对象c的读计数为“1”,因此申请结构写锁y的操作等待在对象c上,申请等待子模块18024需要等待对象c的读计数变为“0”,此时结构写锁y会释放计数同步锁;如果再想申请对象c的结构读锁z,则结构读锁z会获得计数同步锁,申请添加子模块18021将对象a添加关系锁,计数判断子模块18022判断对象c上的写计数是否为“0”,对象c的写计数为“0”,因此对象c添加结构读锁z成功,计数操作子模块18023将对象c上的读计数加“1”,这时,对象c上的读计数和写计数变为(r2,w0)。那么申请添加子模块18021申请结构写锁y的操作需要等待x和z都释放后才能获得计数同步锁,如图17所示,在此不再赘述。

图20为本申请计算机设备一个实施例的结构示意图,上述计算机设备可以包括存储器、处理器及存储在上述存储器上并可在上述处理器上运行的计算机程序,上述处理器执行上述计算机程序时,可以实现本申请实施例提供的数据操作方法。

其中,上述计算机设备可以为服务器、个人计算机(personalcomputer;以下简称:pc)、笔记本电脑、平板电脑或者智能手机等设备,本实施例对上述计算机设备的具体形态不作限定。

图20示出了适于用来实现本申请实施方式的示例性计算机设备12的框图。图20显示的计算机设备12仅仅是一个示例,不应对本申请实施例的功能和使用范围带来任何限制。

如图20所示,计算机设备12以通用计算设备的形式表现。计算机设备12的组件可以包括但不限于:一个或者多个处理器或者处理单元16,系统存储器28,连接不同系统组件(包括系统存储器28和处理单元16)的总线18。

总线18表示几类总线结构中的一种或多种,包括存储器总线或者存储器控制器,外围总线,图形加速端口,处理器或者使用多种总线结构中的任意总线结构的局域总线。举例来说,这些体系结构包括但不限于工业标准体系结构(industrystandardarchitecture;以下简称:isa)总线,微通道体系结构(microchannelarchitecture;以下简称:mac)总线,增强型isa总线、视频电子标准协会(videoelectronicsstandardsassociation;以下简称:vesa)局域总线以及外围组件互连(peripheralcomponentinterconnection;以下简称:pci)总线。

计算机设备12典型地包括多种计算机系统可读介质。这些介质可以是任何能够被计算机设备12访问的可用介质,包括易失性和非易失性介质,可移动的和不可移动的介质。

系统存储器28可以包括易失性存储器形式的计算机系统可读介质,例如随机存取存储器(randomaccessmemory;以下简称:ram)30和/或高速缓存存储器32。计算机设备12可以进一步包括其它可移动/不可移动的、易失性/非易失性计算机系统存储介质。仅作为举例,存储系统34可以用于读写不可移动的、非易失性磁介质(图20未显示,通常称为“硬盘驱动器”)。尽管图20中未示出,可以提供用于对可移动非易失性磁盘(例如“软盘”)读写的磁盘驱动器,以及对可移动非易失性光盘(例如:光盘只读存储器(compactdiscreadonlymemory;以下简称:cd-rom)、数字多功能只读光盘(digitalvideodiscreadonlymemory;以下简称:dvd-rom)或者其它光介质)读写的光盘驱动器。在这些情况下,每个驱动器可以通过一个或者多个数据介质接口与总线18相连。存储器28可以包括至少一个程序产品,该程序产品具有一组(例如至少一个)程序模块,这些程序模块被配置以执行本申请各实施例的功能。

具有一组(至少一个)程序模块42的程序/实用工具40,可以存储在例如存储器28中,这样的程序模块42包括——但不限于——操作系统、一个或者多个应用程序、其它程序模块以及程序数据,这些示例中的每一个或某种组合中可能包括网络环境的实现。程序模块42通常执行本申请所描述的实施例中的功能和/或方法。

计算机设备12也可以与一个或多个外部设备14(例如键盘、指向设备、显示器24等)通信,还可与一个或者多个使得用户能与该计算机设备12交互的设备通信,和/或与使得该计算机设备12能与一个或多个其它计算设备进行通信的任何设备(例如网卡,调制解调器等等)通信。这种通信可以通过输入/输出(i/o)接口22进行。并且,计算机设备12还可以通过网络适配器20与一个或者多个网络(例如局域网(localareanetwork;以下简称:lan),广域网(wideareanetwork;以下简称:wan)和/或公共网络,例如因特网)通信。如图20所示,网络适配器20通过总线18与计算机设备12的其它模块通信。应当明白,尽管图20中未示出,可以结合计算机设备12使用其它硬件和/或软件模块,包括但不限于:微代码、设备驱动器、冗余处理单元、外部磁盘驱动阵列、raid系统、磁带驱动器以及数据备份存储系统等。

处理单元16通过运行存储在系统存储器28中的程序,从而执行各种功能应用以及数据处理,例如实现本申请实施例提供的数据操作方法。

本申请实施例还提供一种非临时性计算机可读存储介质,其上存储有计算机程序,上述计算机程序被处理器执行时实现本申请实施例提供的数据操作方法。

上述非临时性计算机可读存储介质可以采用一个或多个计算机可读的介质的任意组合。计算机可读介质可以是计算机可读信号介质或者计算机可读存储介质。计算机可读存储介质例如可以是——但不限于——电、磁、光、电磁、红外线、或半导体的系统、装置或器件,或者任意以上的组合。计算机可读存储介质的更具体的例子(非穷举的列表)包括:具有一个或多个导线的电连接、便携式计算机磁盘、硬盘、随机存取存储器(ram)、只读存储器(readonlymemory;以下简称:rom)、可擦式可编程只读存储器(erasableprogrammablereadonlymemory;以下简称:eprom)或闪存、光纤、便携式紧凑磁盘只读存储器(cd-rom)、光存储器件、磁存储器件、或者上述的任意合适的组合。在本文件中,计算机可读存储介质可以是任何包含或存储程序的有形介质,该程序可以被指令执行系统、装置或者器件使用或者与其结合使用。

计算机可读的信号介质可以包括在基带中或者作为载波一部分传播的数据信号,其中承载了计算机可读的程序代码。这种传播的数据信号可以采用多种形式,包括——但不限于——电磁信号、光信号或上述的任意合适的组合。计算机可读的信号介质还可以是计算机可读存储介质以外的任何计算机可读介质,该计算机可读介质可以发送、传播或者传输用于由指令执行系统、装置或者器件使用或者与其结合使用的程序。

计算机可读介质上包含的程序代码可以用任何适当的介质传输,包括——但不限于——无线、电线、光缆、rf等等,或者上述的任意合适的组合。

可以以一种或多种程序设计语言或其组合来编写用于执行本申请操作的计算机程序代码,所述程序设计语言包括面向对象的程序设计语言—诸如java、smalltalk、c++,还包括常规的过程式程序设计语言—诸如“c”语言或类似的程序设计语言。程序代码可以完全地在用户计算机上执行、部分地在用户计算机上执行、作为一个独立的软件包执行、部分在用户计算机上部分在远程计算机上执行、或者完全在远程计算机或服务器上执行。在涉及远程计算机的情形中,远程计算机可以通过任意种类的网络——包括局域网(localareanetwork;以下简称:lan)或广域网(wideareanetwork;以下简称:wan)连接到用户计算机,或者,可以连接到外部计算机(例如利用因特网服务提供商来通过因特网连接)。

本申请实施例还提供一种计算机程序产品,当上述计算机程序产品中的指令由处理器执行时,可以实现本申请实施例提供的数据操作方法。

在本说明书的描述中,参考术语“一个实施例”、“一些实施例”、“示例”、“具体示例”、或“一些示例”等的描述意指结合该实施例或示例描述的具体特征、结构、材料或者特点包含于本申请的至少一个实施例或示例中。在本说明书中,对上述术语的示意性表述不必须针对的是相同的实施例或示例。而且,描述的具体特征、结构、材料或者特点可以在任一个或多个实施例或示例中以合适的方式结合。此外,在不相互矛盾的情况下,本领域的技术人员可以将本说明书中描述的不同实施例或示例以及不同实施例或示例的特征进行结合和组合。

此外,术语“第一”、“第二”仅用于描述目的,而不能理解为指示或暗示相对重要性或者隐含指明所指示的技术特征的数量。由此,限定有“第一”、“第二”的特征可以明示或者隐含地包括至少一个该特征。在本申请的描述中,“多个”的含义是至少两个,例如两个,三个等,除非另有明确具体的限定。

流程图中或在此以其他方式描述的任何过程或方法描述可以被理解为,表示包括一个或更多个用于实现定制逻辑功能或过程的步骤的可执行指令的代码的模块、片段或部分,并且本申请的优选实施方式的范围包括另外的实现,其中可以不按所示出或讨论的顺序,包括根据所涉及的功能按基本同时的方式或按相反的顺序,来执行功能,这应被本申请的实施例所属技术领域的技术人员所理解。

在流程图中表示或在此以其他方式描述的逻辑和/或步骤,例如,可以被认为是用于实现逻辑功能的可执行指令的定序列表,可以具体实现在任何计算机可读介质中,以供指令执行系统、装置或设备(如基于计算机的系统、包括处理器的系统或其他可以从指令执行系统、装置或设备取指令并执行指令的系统)使用,或结合这些指令执行系统、装置或设备而使用。就本说明书而言,“计算机可读介质”可以是任何可以包含、存储、通信、传播或传输程序以供指令执行系统、装置或设备或结合这些指令执行系统、装置或设备而使用的装置。计算机可读介质的更具体的示例(非穷尽性列表)包括以下:具有一个或多个布线的电连接部(电子装置),便携式计算机盘盒(磁装置),随机存取存储器(randomaccessmemory;以下简称:ram),只读存储器(readonlymemory;以下简称:rom),可擦除可编辑只读存储器(erasableprogrammablereadonlymemory;以下简称:eprom)或闪速存储器,光纤装置,以及便携式光盘只读存储器(compactdiscreadonlymemory;以下简称:cd-rom)。另外,计算机可读介质甚至可以是可在其上打印所述程序的纸或其他合适的介质,因为可以例如通过对纸或其他介质进行光学扫描,接着进行编辑、解译或必要时以其他合适方式进行处理来以电子方式获得所述程序,然后将其存储在计算机存储器中。

应当理解,本申请的各部分可以用硬件、软件、固件或它们的组合来实现。在上述实施方式中,多个步骤或方法可以用存储在存储器中且由合适的指令执行系统执行的软件或固件来实现。如,如果用硬件来实现和在另一实施方式中一样,可用本领域公知的下列技术中的任一项或他们的组合来实现:具有用于对数据信号实现逻辑功能的逻辑门电路的离散逻辑电路,具有合适的组合逻辑门电路的专用集成电路,可编程门阵列(programmablegatearray;以下简称:pga),现场可编程门阵列(fieldprogrammablegatearray;以下简称:fpga)等。

本技术领域的普通技术人员可以理解实现上述实施例方法携带的全部或部分步骤是可以通过程序来指令相关的硬件完成,所述的程序可以存储于一种计算机可读存储介质中,该程序在执行时,包括方法实施例的步骤之一或其组合。

此外,在本申请各个实施例中的各功能单元可以集成在一个处理模块中,也可以是各个单元单独物理存在,也可以两个或两个以上单元集成在一个模块中。上述集成的模块既可以采用硬件的形式实现,也可以采用软件功能模块的形式实现。所述集成的模块如果以软件功能模块的形式实现并作为独立的产品销售或使用时,也可以存储在一个计算机可读取存储介质中。

上述提到的存储介质可以是只读存储器,磁盘或光盘等。尽管上面已经示出和描述了本申请的实施例,可以理解的是,上述实施例是示例性的,不能理解为对本申请的限制,本领域的普通技术人员在本申请的范围内可以对上述实施例进行变化、修改、替换和变型。

当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1