一种数据加锁及解锁的方法及装置与流程

文档序号:11063388阅读:738来源:国知局
一种数据加锁及解锁的方法及装置与制造工艺

本申请涉及信息技术领域,尤其涉及一种数据加锁及解锁的方法及装置。



背景技术:

随着信息化社会的发展,人们的工作和生活会产生大量的数据信息,而简单原始的数据管理方式(如,人工管理,文件系统),并不能满足人们的方便快捷的管理大量数据的需求,于是如何充分有效地管理和利用各类信息资源,成为人们在信息化社会中首要解决的问题。其中,数据库技术便是现在人们通用的解决如何管理大量数据的方法,这也使得数据库技术成为管理信息系统、办公自动化系统、决策支持系统等各类信息系统的核心部分,是进行科学研究和决策管理的重要技术手段。

现有数据库技术中,其特点之一便是数据共享性高,由于数据库系统中存储管理的数据是面向整体使用用户的,所以数据可以被多个用户或应用程序共享使用。而当数据被调用后,该段数据可能会被修改,若一个数据同时被多个用户调用,则会出现返回的数据不一致,导致该数据出现错误的情况。现有技术中一般使用内存锁或者行锁来保证数据库系统中数据的一致性,减少数据库系统中出现脏数据的问题。

但是,在使用内存锁锁定资源时,当对该资源的处理完毕后,需要手动解除该内存锁,由于内存锁的释放必须在数据库事务提交之前,否则会形成死锁而无法正常释放,而释放内存锁与提交事务之间存在时间差,这就使得其他的线程有可能在该资源的内存锁解除后、事务提交之前抢占该资源。相当于该资源同时被两个不同的线程抢占了,而当两个线程返回不同的结果时,该资源就会出现错误,从而导致数据库系统出现脏数据、数据一致性低的问题。

在使用行锁时,行锁会锁定数据库系统中某一个表中的某一个数据,当多个线程抢夺同一个数据时,只有一个线程可以锁定该数据,其他线程只能等待该数据的行锁解除,而该行锁的解除只有等到该线程所在的事务提交后才会解除。这就使得,若出现一个需要长时间处理的事务,其中的线程采用行锁对某个数据加锁时,其他需要调用该数据的线程只能一直等待,而不能进行其他操作,直到锁定该数据的行锁解除,从而导致数据库事务的执行效率低的问题。



技术实现要素:

本申请实施例提供一种数据加锁及解锁的方法及装置,用以解决现有技术中使用内存锁导致数据库系统出现脏数据,数据一致性低,使用行锁导致数据库事务的执行效率低的问题。

本申请实施例提供的一种数据加锁及解锁的方法,包括:

确定数据库事务需要调用的数据集;

采用内存锁和行锁对所述数据集进行加锁;

当所述数据库事务执行完毕后,判断所述内存锁是否释放;

若是,则允许提交所述数据库事务,并在提交所述数据库事务时释放所述行锁;

若否,则不允许提交所述数据库事务。

本申请实施例提供的一种数据加锁及解锁的装置,包括:

确定模块,用于确定数据库事务需要调用的数据集;

加锁模块,用于采用内存锁和行锁对所述数据集进行加锁;

判断提交模块,用于当所述数据库事务执行完毕后,判断所述内存锁是否释放,若是,则允许提交所述数据库事务,并在提交所述数据库事务时释放所述行锁,若否,则不允许提交所述数据库事务。

本申请实施例提供一种数据加锁及解锁的方法及装置,该方法通过同时采用内存锁和行锁对数据库事务需要调用的数据集进行加锁,使得其他事务或线 程在对所述已加锁的数据集调用时,会因为内存锁的机制,直接返回调用失败的结果,而不会长时间等待,所以其他需要调用该数据集的线程可以继续执行其他操作,从而提高了数据库事务的执行效率。并且,在本申请实施例中该数据库事务处理完毕后,需要先确认用户手动释放内存锁后,才允许该数据库事务提交。而在该内存锁释放之后,该数据库事务调用的数据集仍然被行锁锁定,在行锁的机制中,只有在该数据库事务提交时该行锁才会自动释放,因此其他事务或线程不会在该数据库事务提交前调用到该数据集,只能在该数据库事务提交后(同时行锁自动释放后)调用到该数据集,所以避免了数据库系统中因为单独使用内存锁而导致数据库系统中数据一致性低的问题。

附图说明

此处所说明的附图用来提供对本申请的进一步理解,构成本申请的一部分,本申请的示意性实施例及其说明用于解释本申请,并不构成对本申请的不当限定。在附图中:

图1为本申请实施例提供的数据加锁及解锁的过程;

图2为本申请实施例提供的数据加锁及解锁的装置示意图。

具体实施方式

由于内存锁或行锁各自的运行机制,现有技术中采用内存锁或者行锁对数据库系统中数据集进行加锁或解锁时,数据库系统中容易出现数据一致性低,或者出现数据库事务的执行效率低的问题。因此,为了提高数据库系统中数据的一致性和数据库事务的执行效率,本申请实施例同时采用内存锁和行锁对数据库事务需要调用的数据集进行加锁,使得其他事务或线程在本方案对所述已加锁的数据集调用时,会因为内存锁的机制,直接返回调用失败的结果,而不会长时间等待,所以其他需要调用该数据集的线程可以继续执行其他操作,从而提高了数据库事务的执行效率。并且,在本申请实施例中该数据库事务处理 完毕后,需要先确认用户手动释放内存锁后,才允许该数据库事务提交。而在内存锁释放之后,该数据库事务调用的数据集仍然被行锁锁定,由于在行锁的机制中,一旦该数据库事务提交便会自动释放,因此其他事务或线程不会在该数据库事务提交前调用到该数据集,只能在该数据库事务提交后调用到该数据集,所以避免了数据库系统中因为单独使用内存锁而导致数据库系统中数据一致性低的问题。

为使本申请的目的、技术方案和优点更加清楚,下面将结合本申请具体实施例及相应的附图对本申请技术方案进行清楚、完整地描述。显然,所描述的实施例仅是本申请一部分实施例,而不是全部的实施例。基于本申请中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本申请保护的范围。

图1为本申请实施例提供的数据加锁及解锁的过程,具体包括以下步骤:

S101:确定数据库事务需要调用的数据集。

在本申请实施例中,所述的数据库事务可以是在数据库系统中执行的,具体的,该数据库事务可以是由客户端直接发送给数据库系统执行的,也可以是由客户端发送指令给数据库系统(客户端可直接发送指令给数据库系统,也可通过服务器将指令发送给数据库系统),数据库系统根据该指令生成并执行相应的数据库事务。

当由数据库系统根据客户端发送的指令生成数据库事务时,该指令在数据库系统中可对应一个或多个业务代码,数据库系统则可根据该指令对应的业务代码生成相应的数据库事务。

另外,上述的数据库系统可以由两类服务器组成,一类是用于生成和执行包含各种业务代码的数据库事务的应用服务器,另一类是只用于存储数据的数据库服务器。其中,该应用服务器和数据库服务器,可以是一个也可以是多个。而且,应用服务器除了可以用于生成和执行数据库事务以外,还可执行如调用数据、对数据加锁、将数据的锁释放等操作。使用这种形式的数据库系统,可 以使数据库系统的管理、升级、扩容都相对简便,同时,其可处理的业务代码和存储的数据都较多。当然,本申请中所述的数据库系统也可以是其他形式的数据库系统,本申请对此不做限定。

在本申请实施例中,数据库系统(具体可以是上述的应用服务器)在确定数据库事务需要调用的数据集时,具体可根据该数据库事务中包含的各业务代码,确定所有需要调用的数据(这些数据具体可存储在上述的数据库服务器中),确定出的这些数据就构成了本申请中所述的数据集。

例如,假设在一个银行系统中,张先生对自己的账户做出了向王先生账户转账200元人民的操作,则该银行对应的数据库系统接收到了“将账户A中的存款200元人民币转账到账号B中”的指令,其中,账户A代表张先生的账户,账户B代表王先生的账户。该指令对应的数据库事务则包含“将账户A的人民币数值减少200”和“将账户B的人民币数值增加200”分别对应的两个业务代码,简称业务代码a和业务代码b。则应用服务器根据该业务代码a和业务代码b可以确定该数据库事务需要调用的数据集。其中,该数据集包含:账户A的用户名(张某某)、账户A的用户属性(如,张某某的身份证号、账户种类等)、账户A的账户余额(如,人民币余额、外币余额、信用卡消费余额、缴纳贷款余额等)、账户B的用户名(王某某)、账户B的用户属性、账户B的账户余额这六个数据,这六个数据共同组成了该数据库事务需要调用的数据集。

S102:采用内存锁和行锁对所述数据集进行加锁。

通过步骤S101确定了数据库事务需要调用的数据集后,为了保证数据库系统中数据的一致性,需要将该确定的数据集进行加锁处理,使得在本数据库事务进行过程中,调用的该数据集不会被运行其他数据库事务的线程调用。于是,在本申请实施例中,可同时采用内存锁和行锁对确定出的数据集进行加锁。

具体的,可先采用内存锁对该数据集进行加锁处理,再采用行锁对所述数据集进行加锁处理。

之所以先使用内存锁进行加锁处理的原因是,在采用内存锁对一个数据集加锁后,其他线程若再调用该数据集时,则会立刻获得一个调用出错的结果,而其他线程一旦接收到调用出错的结果,就不会一直等待内存锁的释放,可以执行其他操作。而如果先采用行锁对数据集加锁再采用内存锁对数据集加锁,那么当一个数据集被加上行锁后、尚未被内存锁加锁之前,若其他线程调用该数据集中的数据,则数据库系统并不会给其他线程返回调用出错的结果,这就会使其他线程一直等待该行锁的释放。而其他线程这种无谓的等待会使得整个数据库系统中的各数据库事务的执行效率降低。于是先对该数据集采用内存锁进行加锁处理,则可以在保证数据库系统中数据的一致性的前提下,保证其他线程不会在一个数据集被加上行锁后、尚未被内存锁加锁之前调用该数据集中的数据,从而可以使其他线程无需浪费等待时间,有效地提高数据库事务的执行效率。

需要说明的是,采用内存锁对数据集加锁时,是对数据集中的所有数据进行加锁,具体的,内存锁可识别数据集中存在的所有数据标识,并对所有的数据标识进行加锁,从而锁定数据集中每个数据标识对应的所有数据(一个数据标识对应的数据可能有多个)。继续沿用上例,由于该数据库事务中的业务代码a和业务代码b包含账户A和账户B对应的数据标识,假设这两个数据标识分别为α和β,因此,可根据业务代码a和业务代码b识别出数据标识α和β。由于数据标识α对应的数据为账户A的用户名、账户A的用户属性、账户A的账户余额,数据标识β对应的数据为账户B的用户名、账户B的用户属性、账户B的账户余额,则采用内存锁对数据标识α和β加锁时,会将上述的所有数据都进行加锁,即,这时账户A和账户B对应的所有数据均被锁定。

进一步的,在采用内存锁加锁后,还需要采用行锁对该数据集加锁,而行锁并不能针对数据标识进行加锁,仅仅是对一个或几个数据分别进行加锁,因此,采用行锁进行加锁时,可在数据集中确定出该数据库事务需要调用的数据,再采用行锁对确定出的数据进行加锁。继续沿用上例,张先生的账户A中有用 户名、用户属性、账户余额等数据。而该数据库事务仅仅需要针对张先生账户A中的账户余额进行改动,因此,数据库系统可确定出该数据集中需要调用的数据为账户A的账户余额,从而采用行锁加锁时,可以只对账户A的账户余额采用行锁加锁,而无需对其他数据加锁。

S103:当所述数据库事务执行完毕后,判断所述内存锁是否释放,若是,则执行步骤S104,否则,执行步骤S105。

S104:允许提交所述数据库事务,并在提交所述数据库事务时释放所述行锁。

S105:不允许提交所述数据库事务。

其中,数据库系统具体执行数据库事务的方法并不在本申请的保护范围之内。

当数据库事务执行完毕后,由于内存锁不能自动释放,只有执行了用户输入的释放函数才会释放,因此,当该数据库事务执行完毕后,数据库系统需要判断在步骤S102中对该调用的数据集加锁的内存锁是否已经释放。具体的,数据库系统可判断是否已经执行了用户输入的该内存锁对应的释放函数,若已经执行,则可判定该内存锁已经释放,若未执行,则可判定该内存锁尚未释放。

并且,由于该内存锁的释放函数在该数据库事务提交之后便无法执行了,所以该内存锁的释放函数必须在该数据库事务提交之前执行,而内存锁的释放与数据库事务的提交并不是同步的,于是会出现在释放内存锁后、数据库事务提交前,被内存锁释放的数据集被其他线程调取的情况,从而导致出现该数据集一致性被破坏的可能。但是本申请实施例所述的方法在步骤S102中不仅仅加锁了内存锁,还加锁了行锁,所以即使内存锁先释放,也不会出现数据库事务需要调用的数据被其他线程调用的状况。

当内存锁释放之后,该数据库事务处于已经执行完毕所有业务代码,并且对应的内存锁已经释放的状态,而这时该数据库事务尚未释放在步骤S102中加锁的行锁,所以该数据库事务下一步还需要进行据库事务提交和行锁的释 放,才能将该数据库事务全部执行完毕。而由于行锁的机制是,当数据库事务执行到数据库事务提交的指令时,行锁便自动释放(即,不需要线程执行任何的释放行锁的操作,只需要执行数据库事务提交的操作,该数据库事务对应的行锁就会自动释放),所以在释放内存锁之后直接提交该数据库事务,也可以保证数据库系统中数据的一致性。

于是,在本申请中,当数据库事务对应的内存锁被释放后,可以通过步骤S103判断该内存锁是否释,若是,则执行步骤S104允许提交该数据库事务,在该数据库事务提交的同时行锁自动释放,若否,则执行步骤S105不允许提交该数据库事务。

继续沿用上例,假设当数据库事务的业务代码a和业务代码b均执行完毕后,数据库系统中的应用服务器可判断运行该数据库事务的线程是否执行了用户输入的内存锁对应的释放函数。即对数据标识α和β对应的数据组成的数据集是否执行了释放函数。若已经执行了释放函数,则判断该数据库事务的对应的内存锁已经释放,若还没有执行对应的释放函数,则判断该数据库事务的对应的内存锁未释放。

当已经执行了释放函数时,则数据库系统对张先生的账户A和王先生的账户B对应的数据标识α和β的内存锁加锁已经被释放,其他用户已经可以通过指令访问或者调用数据标识α和β对应的数据了。但是由于数据库事务仍然对数据标识α和β中的某些数据保持行锁的加锁(如,账户A的账户余额仍保持采用行锁加锁的状态),所以其他用户仍然无法对张先生的账户A的账户余额进行调用,但可以调用数据集中未被行锁加锁的数据(如,账户A的用户属性)。假设在数据库事务的内存锁释放之后,但行锁尚未释放之前,正好刘女士想要向张先生的账户A转账,则刘女士这一行为对应的数据库事务无法调用账户A的账户余额对应的数据,而只能等待账户A的账户余额加锁的行锁释放。可见,即便释放了内存锁,张先生进行转账的数据库事务也可通过行锁,来保证数据库系统中数据的一致性。

同时,由于内存锁的释放是在数据库事务中各业务代码已经执行完毕的前提条件之下,所以该数据库事务已经不再包含其他耗时的操作,而只要判断数据库事务对应的内存锁已经被释放,就可允许提交该数据库事务,数据库系统中的应用服务器在该数据库事务的提交时,则自动释放该数据库事务对应的行锁。

通过上述方法,在数据库事务执行时,该数据库事务调用的数据集可以完好的被内存锁和行锁锁定,使得其他线程无法调用,并且通过应用内存锁和行锁的机制,使得其他线程在调用加锁的数据集时,可以直接获得调用出错的返回结果而执行其他操作,无需长时间等待,同时也不会在该数据库事务提交之前调用到其加锁行锁的数据,因此,通过本申请实施例提供的方法,可以有效的保证数据库系统中数据的一致性,还可以提高各数据库事务的执行效率。

另外,本申请实施例在步骤S102中数据库事务采用内存锁和行锁对所述数据集进行加锁时,若该数据库事务需要调用的数据集已经加锁其他数据库事务对应的内存锁,则该数据库事务会获得一个调用出错的返回结果。执行该数据库事务的线程便可以执行其他操作,而不会浪费时间等待调用该数据集。

需要说明的是,本申请实施例提供的方法可适用于各类型的数据库系统中,只要该数据库系统存在内存锁和行锁即可。

以上为本申请实施例提供的数据加锁及解锁的方法,基于图1所示方法同样的思路,本申请实施例还提供数据加锁及解锁的装置,如图2所示。

图2为本申请实施例提供的数据加锁及解锁的装置结构示意图,具体包括:

确定模块201,用于确定数据库事务需要调用的数据集;

加锁模块202,用于采用内存锁和行锁对所述数据集进行加锁;

判断提交模块203,用于当该数据库事务执行完毕后,判断该内存锁是否释放,若是,则允许提交所述数据库事务,并在提交所述数据库事务时释放所述行锁,若否,则不允许提交所述数据库事务。

所述确定模块201,用于根据数据库事务中包含的业务代码,确定该数据 库事务需要调用的数据集。

所述加锁模块202,用于先采用内存锁对该数据集进行加锁,再采用行锁对该数据集进行加锁。

所述加锁模块202,用于在该数据集中采用行锁对该数据集进行加锁时,还用于确定所述数据库事务需要调用的数据,采用行锁对确定的所述数据进行加锁。

所述判断提交模块203,用于判断所述内存锁是否释放时,还用于判断是否已经执行了用户输入的所述内存锁对应的释放函数,若是,则判定所述内存锁已经释放,否则,判定所述内存锁未释放。

具体的,上述如图2所示的认证装置可以位于数据库系统中。

在一个典型的配置中,计算设备包括一个或多个处理器(CPU)、输入/输出接口、网络接口和内存。

内存可能包括计算机可读介质中的非永久性存储器,随机存取存储器(RAM)和/或非易失性内存等形式,如只读存储器(ROM)或闪存(flash RAM)。内存是计算机可读介质的示例。

计算机可读介质包括永久性和非永久性、可移动和非可移动媒体可以由任何方法或技术来实现信息存储。信息可以是计算机可读指令、数据结构、程序的模块或其他数据。计算机的存储介质的例子包括,但不限于相变内存(PRAM)、静态随机存取存储器(SRAM)、动态随机存取存储器(DRAM)、其他类型的随机存取存储器(RAM)、只读存储器(ROM)、电可擦除可编程只读存储器(EEPROM)、快闪记忆体或其他内存技术、只读光盘只读存储器(CD-ROM)、数字多功能光盘(DVD)或其他光学存储、磁盒式磁带,磁带磁磁盘存储或其他磁性存储设备或任何其他非传输介质,可用于存储可以被计算设备访问的信息。按照本文中的界定,计算机可读介质不包括暂存电脑可读媒体(transitory media),如调制的数据信号和载波。

还需要说明的是,术语“包括”、“包含”或者其任何其他变体意在涵盖非排 他性的包含,从而使得包括一系列要素的过程、方法、商品或者设备不仅包括那些要素,而且还包括没有明确列出的其他要素,或者是还包括为这种过程、方法、商品或者设备所固有的要素。在没有更多限制的情况下,由语句“包括一个......”限定的要素,并不排除在包括所述要素的过程、方法、商品或者设备中还存在另外的相同要素。

本领域技术人员应明白,本申请的实施例可提供为方法、系统或计算机程序产品。因此,本申请可采用完全硬件实施例、完全软件实施例或结合软件和硬件方面的实施例的形式。而且,本申请可采用在一个或多个其中包含有计算机可用程序代码的计算机可用存储介质(包括但不限于磁盘存储器、CD-ROM、光学存储器等)上实施的计算机程序产品的形式。

以上所述仅为本申请的实施例而已,并不用于限制本申请。对于本领域技术人员来说,本申请可以有各种更改和变化。凡在本申请的精神和原理之内所作的任何修改、等同替换、改进等,均应包含在本申请的权利要求范围之内。

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