数据库对象的封锁方法、装置、设备和存储介质与流程

文档序号:20164256发布日期:2020-03-24 21:19阅读:345来源:国知局
数据库对象的封锁方法、装置、设备和存储介质与流程

本发明涉及数据库管理技术领域,尤其涉及一种数据库对象的封锁方法、装置、设备和存储介质。



背景技术:

数据封锁是数据库管理系统进行并发控制的重要技术手段,用于管理数据库共享资源的并发访问,确保多个事务在并发执行过程中,能够访问到正确、一致的数据库对象。用于封锁数据库对象的锁,称为字典锁。

在访问任何数据库对象之前,都需要先采用字典锁封锁数据库对象,否则,可能会由于在并发场景下数据库对象的定义发生变化而引发系统异常。例如,一用户正在执行更新t1数据表的c1列数据的操作,另一用户同时发起执行删除t1数据表中c1列的操作,如此,更新语句执行过程中数据库对象的定义发生变化,将不可避免地引发数据访问错乱,并导致数据库系统异常。现有技术在需要访问某一数据库对象时,会首先调用全局临界区对象为数据库对象创建字典锁,并在结束对当前数据库对象的访问后,调用全局临界区对象释放该字典锁。

但是,在应用系统存在大量并发操作时,现有技术中的字典封锁方法需要频繁地申请与释放字典锁,故而需要反复调用全局临界区对象,而全局临界区对象具有互斥性,同一时间至多只能被一事务调用,因此,现有的字典封锁方法会使得字典封锁出现全局并发冲突,进而导致数据库系统整体执行效率的降低。



技术实现要素:

有鉴于此,本发明实施例提供一种数据库对象的封锁方法、装置、设备和存储介质,以降低字典封锁出现全局并发冲突的概率,提高数据库系统的执行效率。

第一方面,本发明实施例提供了一种数据库对象的封锁方法,包括:

获取当前事务的当前字典锁信息表以及所述当前事务需要对访问的当前数据库对象添加的目标字典锁的类型信息;

如果所述当前字典锁信息表中存在与所述类型信息相符且处于未占用状态的非冲突字典锁,则将所述非冲突字典锁确定为目标字典锁,并将所述目标字典锁由未占用状态标记为占用状态,以采用所述目标字典锁封锁所述当前数据库对象,其中,所述非冲突字典锁为施加于所述当前数据库对象上且不与所述当前数据库对象的已添加字典锁产生封锁冲突的字典锁。

第二方面,本发明实施例提供了一种数据库对象的封锁装置,包括:

信息获取模块,用于获取当前事务的当前字典锁信息表以及所述当前事务需要对访问的当前数据库对象添加的目标字典锁的类型信息;

锁标记模块,用于在所述当前字典锁信息表中存在与所述类型信息相符且处于未占用状态的非冲突字典锁时,将所述非冲突字典锁确定为目标字典锁,并将所述目标字典锁由未占用状态标记为占用状态,以采用所述目标字典锁封锁所述当前数据库对象,其中,所述非冲突字典锁为施加于所述当前数据库对象上且不与所述当前数据库对象的已添加字典锁产生封锁冲突的字典锁。

第三方面,本发明实施例提供了一种数据库管理设备,包括:

一个或多个处理器;

存储器,用于存储一个或多个程序,

当所述一个或多个程序被所述一个或多个处理器执行,使得所述一个或多个处理器实现如本发明实施例所述的数据库对象的封锁方法。

第四方面,本发明实施例还提供了一种计算机可读存储介质,其上存储有计算机程序,其特征在于,该程序被处理器执行时实现如本发明实施例所述的数据库对象的封锁方法。

在上述封锁数据库对象的技术方案中,获取当前事务的当前字典锁信息表以及当前事务需要对访问的当前数据库对象添加的目标字典锁的类型信息,并在当前字典锁信息表中存在与该类型信息相符且处于未占用状态的非冲突字典锁时,将该非冲突字典锁确定为目标字典锁,并将该目标字典锁由未占用状态标记为占用状态,从而采用该目标字典锁封锁该当前数据库对象。本发明实施例通过采用上述技术方案,采用当前事务已施加于当前数据库对象上、与需要添加的目标数据锁类型相符且未处于占用状态的非冲突字典锁对当前数据库对象进行封锁,而不再重新创建目标字典锁,能够降低字典锁的创建次数,从而减少因字典锁创建而对全局临界区对象进行占用的次数,降低字典封锁出现全局并发冲突的概率,提高数据库系统的执行效率。

附图说明

通过阅读参照以下附图所作的对非限制性实施例所作的详细描述,本发明的其它特征、目的和优点将会变得更明显:

图1为本发明实施例一提供的一种数据库对象的封锁方法的流程示意图;

图2为本发明实施例二提供的一种数据库对象的封锁方法的流程示意图;

图3为本发明实施例三提供的一种数据库对象的封锁装置的结构框图;

图4为本发明实施例四提供的一种数据库管理设备的结构示意图。

具体实施方式

下面结合附图和实施例对本发明作进一步的详细说明。可以理解的是,此处所描述的具体实施例仅仅用于解释本发明,而非对本发明的限定。另外还需要说明的是,为了便于描述,附图中仅示出了与本发明相关的部分而非全部内容。此外,在不冲突的情况下,本发明中的实施例及实施例中的特征可以相互组合

实施例一

本发明实施例一提供一种数据库对象的封锁方法。该方法可以由数据库对象的封锁装置执行,其中,该装置可以由软件和/或硬件实现,一般可集成于数据库管理设备中,适用于在访问数据库中的数据库对象之前对数据库对象进行字典封锁的情况。图1为本发明实施例一提供的一种数据库对象的封锁方法的流程示意图,如图1所示,所述数据库对象的封锁方法包括:

s110、获取当前事务的当前字典锁信息表以及所述当前事务需要对访问的当前数据库对象添加的目标字典锁的类型信息。

具体的,在确定当前事务需要对当前数据库对象进行访问时,可以调取当前事务的当前字典锁信息表,并基于当前事务在访问当前数据库对象时需要执行操作的操作类型确定需要对当前数据库对象添加的目标字典锁的类型信息,例如,在执行结构化查询语言(structuredquerylanguage,sql)语句时,根据sql语句的类型和其所请求操作,分别对其所请求访问的当前数据库对象进行不同类型的字典封锁,如当sql语句为数据操纵语言(datamanipulationlanguage,dml)且其所请求操作为读操作时,确定当前事务需要为当前数据库对象添加的字典锁为意向共享锁(is);当sql语句为dml且其所请求操作为写操作(即请求对当前数据库对象进行插入、删除或更新操作)时,确定当前事务需要为当前数据库对象添加的字典锁为意向排它锁(ix);当sql语句为数据定义语言(datadefinitionlanguage,ddl)时,由于ddl一般出现于对数据进行定义修改的过程,故确定当前事务需要为当前数据库对象添加的字典锁为排它锁(x),等等。

其中,当前事务可以理解为当前正在执行的事务,其可以为用户所请求执行的事务;当前字典锁信息表可以理解为当前事务的字典锁信息表,其具体可以为当前事务所属通信连接(即请求执行当前事务的通信连接)的字典锁信息表,如当前事务开始执行时,可以获取当前事务所属通信连接的字典锁信息表作为当前字典锁信息表,相应的,当前事务执行结束后,可以不清空当前字典锁信息表,以供后续执行的具有相同通信连接(如同一账号)的其他事务进行调用;字典锁信息表可以为用于记录属于同一通信连接的各事务所创建但尚未释放的全部字典锁的锁信息的链表;某一字典锁的锁信息可以包括该字典锁的状态信息(如占用/未占用状态信息、等待/未等待状态信息等)、字典锁的类型信息和字典锁所封锁数据库对象的对象id等;当前数据库对象为当前事务需要访问的数据库对象,其可以包括当前事务在执行过程中需要访问的所有数据库对象,也可以仅包括当前事务在当前执行节点需要访问的数据库对象,以下以当前数据库对象为当前事务在当前执行节点需要访问的数据库对象为例进行说明;目标字典锁的类型可以为共享锁(s)、x、is或ix。

s120、如果所述当前字典锁信息表中存在与所述类型信息相符且处于未占用状态的非冲突字典锁,则将所述非冲突字典锁确定为目标字典锁,并将所述目标字典锁由未占用状态标记为占用状态,以采用所述目标字典锁封锁所述当前数据库对象,其中,所述非冲突字典锁为施加于所述当前数据库对象上且不与所述当前数据库对象的已添加字典锁产生封锁冲突的字典锁。

在本步骤中,在确定当前字典锁信息表中存在与目标字典锁类型信息相符且处于未占用状态的非冲突字典锁之后,可以将该非冲突字典锁确定为目标字典锁,并将该目标字典锁由未占用状态标记为占用状态,如删除该目标字典锁的未占用状态标记和/或为该目标字典锁添加占用状态标记,以为当前数据库对象添加该目标字典锁。此外,在为当前数据库对象添加目标字典锁之后,还可以进一步向当前事务返回封锁成功通知,以通知当前事务当前数据库对象封锁成功,可继续执行。

本实施例中,在确定当前字典锁信息表中是否存在与目标字典锁的类型信息相符且处于未占用状态的非冲突字典锁时,可以首先按照目标字典锁对字典锁类型和占用/未占用状态的要求,查询当前事务是否已经对当前数据库对象施加过与目标字典锁的类型信息相符且处于占用状态的字典锁,若是,则向当前事务返回封锁成功通知,字典封锁过程结束;若否,则进一步查询当前事务是否已经对当前数据库对象施加过与目标字典锁的类型信息相符且处于未占用状态的待筛选字典锁,若存在,则进一步确定查询得到的待筛选字典锁是否与当前数据库对象的已添加字典锁产生封锁冲突,即确定待筛选字典锁与已添加于当前数据库对象上的其他字典锁是否冲突,若冲突,则确定当前字典锁信息表中存在与目标字典锁的类型信息相符且处于未占用状态的冲突字典锁;若待筛选字典锁与已添加与当前数据库对象上的其他字典锁均不冲突,则确定当前字典锁信息表中存在与目标字典锁的类型信息相符且处于未占用状态的非冲突字典锁。

在本实施例中,确定待筛选字典锁与已添加于当前数据库对象上的其他字典锁是否产生冲突的方法可以根据需要选取,如检测待筛选字典锁是否具有冲突字典锁标记,若具有,则确定其与已添加于当前数据库对象上的其他字典锁产生冲突,若不具有,则确定其与已添加于当前数据库对象上的其他字典锁兼容,此时,相应的,数据库管理系统可以在每创建一个字典锁之后,均为与该字典锁产生封锁冲突的各字典锁添加冲突字典锁标记,以便于后续各字典锁被调用时,能够基于其是否存在冲突字典锁标记确定其是否与其他字典锁产生封锁冲突。

其中,数据库管理系统创建的某一字典锁与某一其他字典锁是否冲突可基于该字典锁与该其他字典锁的类型信息判断,例如,若该字典锁与该其他字典锁均为is类型字典锁、均为s类型字典锁、均为ix类型字典锁、一为is类型字典锁另一为s类型字典锁或者一为is类型字典锁另一为ix类型字典锁,则该字典锁与该其他字典锁兼容(即不冲突);若该字典锁与该其他字典锁均为x类型字典锁、一为x类型字典锁另一为ix类型字典锁、一为x类型字典锁另一为is类型字典锁、一为x类型字典锁另一为s类型字典锁或者一为ix类型字典锁另一为s类型字典锁,则该字典锁与该其他字典锁冲突。

相应的,本实施例在确定当前字典锁信息表中不存在与目标字典锁的类型信息相符且处于未占用状态的非冲突字典锁时,可以创建与目标字典锁的类型信息相符的字典锁作为目标字典锁,并将该目标字典锁添加于当前数据库对象上。此外,若当前字典锁信息表中存在与目标字典锁的类型信息相符且处于未占用状态的冲突字典锁,由于所创建的目标字典锁与该冲突字典锁为同类型的字典锁,而且该冲突字典锁未被占用且已与当前数据库对象上的其他字典锁产生冲突,因此,优选的,在创建与目标字典锁的类型信息相符的字典锁作为目标字典锁之前,还可以删除该冲突字典锁,以减少当前字典锁信息所占用的存储空间。此时,本实施例所提供的数据库对象的封锁方法可以优化为还包括:如果所述当前字典锁信息表中存在与所述类型信息相符且处于未占用状态的冲突字典锁,则调用全局临界区对象释放所述冲突字典锁,并根据所述类型信息为所述当前数据库对象添加目标字典锁;如果所述当前字典锁信息表中不存在与所述类型信息相符且处于未占用状态的字典锁,则根据所述类型信息为所述当前数据库对象添加目标字典锁。

本发明实施例一提供的数据库对象的封锁方法,获取当前事务的当前字典锁信息表以及当前事务需要对访问的当前数据库对象添加的目标字典锁的类型信息,并在当前字典锁信息表中存在与该类型信息相符且处于未占用状态的非冲突字典锁时,将该非冲突字典锁确定为目标字典锁,并将该目标字典锁由未占用状态标记为占用状态,从而采用该目标字典锁封锁该当前数据库对象。本实施例通过采用上述技术方案,采用当前事务已施加于当前数据库对象上、与需要添加的目标数据所类型相符且未处于占用状态的非冲突字典锁对当前数据库对象进行封锁,而不再重新创建目标字典锁,能够降低字典锁的创建次数,从而减少因字典锁创建而对全局临界区对象进行占用的次数,降低字典封锁出现全局并发冲突的概率,提高数据库系统的执行效率。

在上述实施例的基础上,所述数据库对象的封锁方法还可以优化包括:在检测到所述当前事务结束对所述当前数据库对象的访问时,判断所述目标字典锁是否属于预设类型的非冲突字典锁,若是,则将所述目标字典锁标记为未占用状态;若否,则调用全局临界区对象释放所述目标字典锁。其中,预设类型可以包括is类型和/或ix类型;目标字典锁是否为非冲突字典锁可以通过判断目标字典锁是否具有冲突字典锁标记确定,若其具有冲突字典锁标记,则确定其为冲突字典锁,若不具有冲突字典锁标记,则确定其为非冲突字典锁。

以lock_in_use标记字典锁处于占用状态,以lock_ignorable标记字典锁处于未占用状态,以lock_release_asap标记字典锁与其他字典锁产生封锁冲突,并假设预设类型包括is类型和ix类型,在检测到当前事务结束对当前数据库对象的访问后的操作过程可以为:

a1、检查目标字典锁lock的类型,如果目标字典锁为is或ix类型字典锁,则执行步骤a2;否则,则执行步骤a4。

a2、将lock标记为可忽略,亦即,将lock标记为未占用状态。

a3、检查是否存在其他事务封锁请求产生的、与lock存在封锁冲突且处于占用状态的字典锁(以lock_c1表示),即检查lock是否被设置了lock_release_asap标记,若是,则执行步骤a4;若否,则说明lock未与其他字典锁产生封锁冲突,操作结束。

a4、进入封锁系统的全局临界区,即调用全局临界区对象。

a5、将lock从全局字典锁信息表(如全局封锁hash表)删除。

a6、将lock从lock_c1的等待队列删除。

a7、如果lock为lock_c1等待的最后一把字典锁,则唤醒lock_c1,以使lock_c1对应的事务继续执行,并执行a8;如果lock不为lock_c1等待的最后一把字典锁,则执行a8。

a8、退出封锁系统的全局临界区,即解除对全局临界区对象的调用。

a9、将lock从当前事务的当前字典锁信息表(如字典锁链表)删除并释放lock所占用的存储空间。

在上述优化中,当前事务对当前数据库对象访问结束时,若目标字典锁未与封锁当前数据库对象的其他字典锁产生封锁冲突,则不调用全局临界区对象释放目标字典锁。本申请上述优化,利用dml语句封锁类型不冲突(即dml语句添加的字典锁不存在封锁冲突)的特性,以及实际应用中ddl语句出现的概率极低,绝大部分sql语句都是dml语句的特性,通过延迟释放字典锁的方式,对现有数据库字典封锁过程进行优化,可以降低字典锁的创建次数,从而减少因字典锁释放而对全局临界区对象进行占用的次数,进一步降低字典封锁出现全局并发冲突的概率,提高数据库系统的执行效率。

实施例二

图2为本发明实施例二提供的一种数据库对象的封锁方法的流程示意图,本实施例在上述实施例的基础上,将“根据所述类型信息为所述当前数据库对象添加目标字典锁”优化为:调用全局临界区对象创建与所述类型信息相符的目标字典锁,将所述目标字典锁标记为占用状态,并将所述目标字典锁添加至全局字典锁信息表中;将所述目标字典锁添加至所述当前字典锁信息表中,以采用所述目标字典锁封锁所述当前数据库对象。

进一步地,在所述将所述目标字典锁添加至全局字典锁信息表中之前,还包括:确定全局字典锁信息表中不存在处于占用状态的目标冲突字典锁,所述目标冲突字典锁为所述目标字典锁的冲突字典锁。

进一步地,所述全局字典锁信息表中存在处于占用状态的目标冲突字典锁,在所述将所述目标字典锁添加至全局字典锁信息表中之前,还包括:将所述目标字典锁标记为等待状态,并将所述处于占用状态的目标冲突字典锁添加至所述目标字典锁的等待队列。

相应的,如图2所示,本实施例提供的数据库对象的封锁方法包括:

s210、获取当前事务的当前字典锁信息表以及所述当前事务需要对访问的当前数据库对象添加的目标字典锁的类型信息,执行s220、s230或s240;

s220、如果所述当前字典锁信息表中存在与所述类型信息相符且处于未占用状态的非冲突字典锁,则将所述非冲突字典锁确定为目标字典锁,并将所述目标字典锁由未占用状态标记为占用状态,以采用所述目标字典锁封锁所述当前数据库对象,其中,所述非冲突字典锁为施加于所述当前数据库对象上且不与所述当前数据库对象的已添加字典锁产生封锁冲突的字典锁。

s230、如果所述当前字典锁信息表中存在与所述类型信息相符且处于未占用状态的冲突字典锁,则调用全局临界区对象释放所述冲突字典锁,执行s250,

s240、如果所述当前字典锁信息表中不存在与所述类型信息相符且处于未占用状态的字典锁,则执行s250。

s250、调用全局临界区对象创建与所述类型信息相符的目标字典锁,将所述目标字典锁标记为占用状态。

具体的,可以进入封锁系统的全局临界区,在全局临界区创建与上述类型信息相符的目标字典锁,并为目标字典锁添加占用状态标记。

s260、调用全局临界区对象判断全局字典锁信息表中是否存在处于占用状态的目标冲突字典锁,若是,则执行s270;若否,则执行s280,其中,所述目标冲突字典锁为与所述目标字典锁产生封锁冲突的字典锁。

s270、调用全局临界区对象将所述目标字典锁标记为等待状态,并将所述处于占用状态的目标冲突字典锁添加至所述目标字典锁的等待队列。

在本实施例中,进入全局临界区之后,可以进一步判断是否存在添加于当前数据库对象上且处于占用状态的目标冲突字典锁,并在存在处于占用状态的目标冲突字典锁时,将目标字典锁标记为等待状态,创建目标字典锁的等待队列,并将各处于占用状态的目标冲突字典锁添加至目标字典锁的等待队列中,以使目标字典锁等待各处于占用状态的目标冲突字典锁所对应的事务执行,并在各处于占用状态的目标冲突字典锁所对应的事务均执行完成后,再开始执行当前事务,如在各处于占用状态的目标冲突字典锁均解除占用后,删除目标字典锁的等待状态标记,并唤醒目标字典锁开始执行当前事务,以避免引发数据访问错乱。

其中,目标冲突字典锁可以理解为当前数据库对象上已经添加的、且与当前事务欲添加至当前数据库对象上的目标字典锁产生封锁冲突的字典锁,其可以包括处于占用状态的字典锁和未处于占用状态的字典锁;全局字典锁信息表可以为记录当前时刻数据库中已创建但仍未释放的所有字典锁的锁信息的信息表,其可以为哈希表。

在此,需要说明的是,由于即使同一事务在同一数据库对象上添加的两字典锁就字典锁类型而言是冲突的,二者所对应的操作也是可以同时执行的,因此,本实施例中的目标冲突字典锁优选可以仅包含其他事务添加于当前数据库对象上的、且与当前事务欲添加至当前数据库对象上的目标字典锁产生封锁冲突的字典锁,即若某一字典锁为当前事务添加于当前数据库对象上的字典锁,无论其字典锁类型与当前事务欲添加至当前数据库对象上的目标字典锁的字典锁类型是否冲突,均可以不将其确定为目标冲突字典锁,从而,进一步减少数据库对象封锁过程中对全局临界区对象的调用次数。

在本实施例中,确定全局字典锁信息表中是否存在处于占用状态的目标冲突字典锁的方法可以根据需要选取,如可以首先根据当前数据库对象的对象id自全局字典锁信息表中查询得到当前数据库对象上添加的全部字典锁的类型信息和状态信息,然后根据各字典锁的类型信息得到与目标字典锁产生封锁冲突的目标冲突字典锁,并根据各目标冲突字典锁的状态信息确定是否存在处于占用状态的目标冲突字典锁。

进一步地,本实施例可以在将所述目标字典锁添加至全局字典锁信息表中之前,为全局字典锁信息表中的各目标冲突字典锁添加冲突字典锁标记,如为其添加“lock_release_asap”标记,以便后续添当前事务或其他事务添加字典锁时可以依据各字典锁是否存在冲突字典锁标记即可确定其是否为非冲突字典锁。需要说明的是,在全局字典锁信息表中更改某一字典锁的某一标记与在其对应事务字典锁信息表中更改相应字典锁的当前标记为对同一字典锁的更改操作,当在全局字典锁信息表中更改某一字典锁的某一标记时,该字典锁对应事务的字典锁信息表中会同步进行相应的更改,反之亦然。

s280、调用全局临界区对象将所述目标字典锁添加至全局字典锁信息表中。

具体的,可以通过全局临界区对象将目标字典锁的锁信息添加至全局字典锁信息表中,如将目标字典锁的状态信息、类型信息和字典锁所封锁数据库对象的对象id等添加至全局字典锁信息表中,以便于其他事务在创建其所需向对应数据库对象添加的字典锁时,通过查询全局字典锁信息表接口确定是否存在与其所请求添加的字典锁存在冲突的字典锁。

s290、将所述目标字典锁添加至所述当前字典锁信息表中,以采用所述目标字典锁封锁所述当前数据库对象。

在本步骤中,可以将目标字典锁的锁信息添加至当前事务的当前字典锁信息表中,以便于在当前事务的后续执行过程中需要再次向当前数据库对象添加字典锁时,能够基于当前事务的字典锁信息表(即当前字典锁信息表)查询确定是否需要调用全局临界区对象创建相应类型的字典锁。

示例性的,为数据库中的字典锁对象新增三种状态标记,分别定义如下:

#definelock_in_use0/*lock正在使用中*/

#definelock_ignorable1/*lock可忽略*/

#definelock_release_asap2/*lock已产生封锁冲突,应尽快释放*/本实施例所提供的数据库对象的封锁方法的字典封锁过程可以描述为:

b1、获取当前事务所属通信连接的字典锁链表作为当前事务的字典锁链表(即当前字典锁信息表),扫描该字典锁链表,检查数据库管理系统是否已对当前数据库对象执行过与目标字典锁lock的类型信息相符的字典封锁,若是,则执行步骤b2;若否,则执行步骤b6。

b2、判断该字典锁是否处于占用状态,若是,则向当前事务返回封锁成功通知,字典封锁过程结束;若否,则执行步骤b3。

b3、将已添加且处于未占用状态的字典锁确定为目标字典锁lock,执行lock->ignore&=~lock_ignorable,取消lock的可忽略标记(即未占用状态标记),并将lock重新标识为正在使用中,即将lock标记为占用状态,亦即为lock添加lock_in_use标记。

b4、检查lock是否存在lock_release_asap标记(即冲突字典锁标记),若不存在lock_release_asap标记,则向当前事务返回封锁成功通知,字典封锁过程结束;若存在lock_release_asap标记,则执步骤行b5。

b5、释放lock。

b6、进入封锁系统的全局临界区。

b7、根据当前数据库对象id查找全局字典封锁hash表(即全局字典锁信息表),检查是否存在与目标字典锁的类型信息冲突的字典锁(以lock_c2表示),如果不存在冲突的字典锁,则执行b8;否则,则执行步骤b11。

b8、创建lock,为lock添加lock_in_use标记以标识lock正在使用中,并将新创建的lock加入全局字典封锁hash表中。

b9、退出封锁系统的全局临界区。

b10、将新创建的lock加入当前事务的字典锁链表中,并向当前事务返回封锁成功通知,字典封锁过程结束。

b11、执行lock_c2->ignore|=lock_release_asap,即将lock_c2标记为与其他事务产生封锁冲突,亦即为lock_c2添加lock_release_asap标记。

b12、检查所有lock_c2的可忽略标记,如果所有lock_c2均被标识为可忽略,则返回执行步骤b8;如果存在未被标记为可忽略的lock_c2,即如果存在被标记为正在使用中的lock_c2,则执行步骤b13。

b13、创建lock,执行lock->ignore=lock_in_use将lock标识为正在使用中,将lock标识为等待状态,并将所有被标记为正在使用中的lock_c2加入lock的等待队列中。

b14、将lock加入全局字典封锁hash表。

b15、退出封锁系统的全局临界区。

b16、将新创建的lock加入当前事务的lock链表中,并向当前事务返回锁等待通知,当前事务进入封锁等待状态,直至lock被唤醒为止,并在lock被唤醒时继续执行当前事务。

上述字典封锁过程可应用于任意需要进行字典封锁的场景,以事务q与事务p为用户a请求执行的相邻的两件事务为例,用户a的事务p要向表t插入数据,生成对表t字典对象的ix字典锁lock_p,将其标记为lock_in_use,事务p结束后lock_p不释放,仅将其标识为lock_ignorable,之后用户a在后续事务q要修改表t的数据时,也需要对表t上ix字典锁,此时事务q获取其所属通信连接上的lock链表(即事务p结束执行时的lock链表)作为自身的lock链表,扫描所获取的lock链表,发现lock_p是表t的ix字典锁,将lock_p重新标记为lock_in_use,即可返回封锁成功;而如果使用现有技术通用的字典封锁与释放方法,事务p结束后会释放包括lock_p在内的所有锁(即执行上述步骤a4-a9,清空lock链表),则后续事务q修改表t数据时需要重新申请字典锁,释放和申请字典锁都需要调用全局封锁临界区对象,使得字典封锁的全局具有较高的并发冲突概率,导致数据库系统整体效率的降低。

又如,用户a的事务n先向表t1插入数据,生成对表t1进行字典封锁的ix类型字典锁lock_n_t1,并将其标记为lock_in_use;用户b的事务m修改表t1的表定义(为ddl语句),需要对表t1的字典对象上x类型字典锁,事务m在创建字典锁时进入全局封锁临界区,找到冲突的字典锁lock_n_t1,为lock_n_t1添加lock_release_asap标记,检查发现lock_n_t1存在lock_in_use标记,则创建lock_m_t1,将其标记为lock_in_use,将lock_n_t1加入lock_m_t1的等待队列,退出全局封锁临界区,事务m进入封锁等待状态;用户a的事务n提交,将lock_n_t1置为lock_ignorable,检查发现lock_n_t1被设置了lock_release_asap,则进入全局封锁临界区,将lock_n_t1从全局封锁hash表删除,然后将lock_n_t1从lock_m_t1的等待队列删除,唤醒lock_m_t1,退出全局封锁临界区,并将lock_n_t1从事务p的lock链表中删除;用户b的事务m继续执行,完成对表t1表定义的修改。

本发明实施例二提供的数据库对象的封锁方法,在当前字典锁信息表中存在与当前事务需要对访问的当前数据库对象添加的目标字典锁的类型信息相符且处于未占用状态的非冲突字典锁时,直接采用该字典锁封锁当前数据库对象而不进入全局临界区;在当前字典锁信息表中不存在与目标字典锁的类型信息相符且处于未占用状态的非冲突字典锁时,再进入全局临界区域创建目标字典锁,能够降低字典锁的创建次数,从而减少因字典锁创建而对全局临界区对象进行占用的次数,降低字典封锁出现全局并发冲突的概率,提高数据库系统的执行效率。

实施例三

本发明实施例三提供一种数据库对象的封锁装置。该装置可以由软件和/或硬件实现,一般可集成于数据库管理设备中,适用于在访问数据库中的数据库对象之前对数据库对象进行字典封锁的情况,可通过执行数据库对象的封锁方法对数据库对象进行封锁。图3为本发明实施例三提供的数据库对象的封锁装置的结构示意图,如图3所示,所述装置包括信息获取模块301和锁确定模块302,其中,

信息获取模块301,用于获取当前事务的当前字典锁信息表以及所述当前事务需要对访问的当前数据库对象添加的目标字典锁的类型信息;

锁确定模块302,用于在所述当前字典锁信息表中存在与所述类型信息相符且处于未占用状态的非冲突字典锁时,将所述非冲突字典锁确定为目标字典锁,并将所述目标字典锁由未占用状态标记为占用状态,以采用所述目标字典锁封锁所述当前数据库对象,其中,所述非冲突字典锁为施加于所述当前数据库对象上且不与所述当前数据库对象的已添加字典锁产生封锁冲突的字典锁。

本发明实施例三提供的数据库对象的封锁装置,通过信息获取模块获取当前事务的当前字典锁信息表以及当前事务需要对访问的当前数据库对象添加的目标字典锁的类型信息,并通过锁确定模块在当前字典锁信息表中存在与该类型信息相符且处于未占用状态的非冲突字典锁时,将该非冲突字典锁确定为目标字典锁,并将该目标字典锁由未占用状态标记为占用状态,从而采用该目标字典锁封锁该当前数据库对象。本实施例通过采用上述技术方案,采用当前事务已施加于当前数据库对象上、与需要添加的目标数据所类型相符且未处于占用状态的非冲突字典锁对当前数据库对象进行封锁,而不再重新创建目标字典锁,能够降低字典锁的创建次数,从而减少因字典锁创建而对全局临界区对象进行占用的次数,降低字典封锁出现全局并发冲突的概率,提高数据库系统的执行效率。

进一步地,所述数据库对象的封锁装置还可以包括:锁创建模块,用于在所述当前字典锁信息表中存在与所述类型信息相符且处于未占用状态的冲突字典锁时,调用全局临界区对象释放所述冲突字典锁,并根据所述类型信息为所述当前数据库对象添加目标字典锁;在所述当前字典锁信息表中不存在与所述类型信息相符且处于未占用状态的字典锁时,根据所述类型信息为所述当前数据库对象添加目标字典锁。

在上述方案中,所述锁创建模块可以包括:锁创建单元,用于调用全局临界区对象创建与所述类型信息相符的目标字典锁,将所述目标字典锁标记为占用状态,并将所述目标字典锁添加至全局字典锁信息表中;锁添加单元,用于将所述目标字典锁添加至所述当前字典锁信息表中,以采用所述目标字典锁封锁所述当前数据库对象。

在上述方案中,所述锁创建模块还可以包括:冲突确定单元,用于在所述将所述目标字典锁添加至全局字典锁信息表中之前,确定全局字典锁信息表中不存在处于占用状态的目标冲突字典锁,所述目标冲突字典锁为所述目标字典锁的冲突字典锁。

在上述方案中,所述全局字典锁信息表中存在处于占用状态的目标冲突字典锁,所述锁创建模块还可以包括:锁等待单元,用于在所述将所述目标字典锁添加至全局字典锁信息表中之前,将所述目标字典锁标记为等待状态,并将所述处于占用状态的目标冲突字典锁添加至所述目标字典锁的等待队列。

在上述方案中,所述锁创建模块还可以包括:冲突标记单元,用于在所述将所述目标字典锁添加至全局字典锁信息表中之前,为所述全局字典锁信息表中的目标冲突字典锁添加冲突字典锁标记。

进一步地,所述数据库对象的封锁装置还可以包括:锁释放模块,用于在检测到所述当前事务结束对所述当前数据库对象的访问时,判断所述目标字典锁是否属于预设类型的非冲突字典锁,若是,则将所述目标字典锁标记为未占用状态;若否,则调用全局临界区对象释放所述目标字典锁。

本发明实施例三提供的数据库对象的封锁装置可执行本发明任意实施例提供的数据库对象的封锁方法,具备执行数据库对象的封锁方法相应的功能模块和有益效果。未在本实施例中详尽描述的技术细节,可参见本发明任意实施例所提供的数据库对象的封锁方法。

实施例四

图4为本发明实施例四提供的一种数据库管理设备的结构示意图,如图4所示,该数据库管理设备包括处理器40和存储器41;数据库管理设备中处理器40的数量可以是一个或多个,图4中以一个处理器40为例;数据库管理设备中的处理器40和存储器41可以通过总线或其他方式连接,图4中以通过总线连接为例。

存储器41作为一种计算机可读存储介质,可用于存储软件程序、计算机可执行程序以及模块,如本发明实施例中的数据库对象的封锁方法对应的程序指令/模块(例如,数据库对象的封锁装置中的信息获取模块301和锁确定模块302)。处理器40通过运行存储在存储器41中的软件程序、指令以及模块,从而执行数据库管理设备的各种功能应用以及数据处理,即实现上述的数据库对象的封锁方法。

存储器41可主要包括存储程序区和存储数据区,其中,存储程序区可存储操作系统、至少一个功能所需的应用程序;存储数据区可存储根据终端的使用所创建的数据等。此外,存储器41可以包括高速随机存取存储器,还可以包括非易失性存储器,例如至少一个磁盘存储器件、闪存器件、或其他非易失性固态存储器件。在一些实例中,存储器41可进一步包括相对于处理器40远程设置的存储器,这些远程存储器可以通过网络连接至数据库管理设备。上述网络的实例包括但不限于互联网、企业内部网、局域网、移动通信网及其组合。

本发明实施例四还提供一种包含计算机可执行指令的存储介质,所述计算机可执行指令在由计算机处理器执行时用于执行一种数据库对象的封锁方法,该方法包括:

获取当前事务的当前字典锁信息表以及所述当前事务需要对访问的当前数据库对象添加的目标字典锁的类型信息;

如果所述当前字典锁信息表中存在与所述类型信息相符且处于未占用状态的非冲突字典锁,则将所述非冲突字典锁确定为目标字典锁,并将所述目标字典锁由未占用状态标记为占用状态,以采用所述目标字典锁封锁所述当前数据库对象,其中,所述非冲突字典锁为施加于所述当前数据库对象上且不与所述当前数据库对象的已添加字典锁产生封锁冲突的字典锁。

当然,本发明实施例所提供的一种包含计算机可执行指令的存储介质,其计算机可执行指令不限于如上所述的方法操作,还可以执行本发明任意实施例所提供的数据库对象的封锁方法中的相关操作。

通过以上关于实施方式的描述,所属领域的技术人员可以清楚地了解到,本发明可借助软件及必需的通用硬件来实现,当然也可以通过硬件实现,但很多情况下前者是更佳的实施方式。基于这样的理解,本发明的技术方案本质上或者说对现有技术做出贡献的部分可以以软件产品的形式体现出来,该计算机软件产品可以存储在计算机可读存储介质中,如计算机的软盘、只读存储器(read-onlymemory,rom)、随机存取存储器(randomaccessmemory,ram)、闪存(flash)、硬盘或光盘等,包括若干指令用以使得一台计算机设备(可以是个人计算机,服务器,或者网络设备等)执行本发明各个实施例所述的方法。

值得注意的是,上述数据库对象的封锁装置的实施例中,所包括的各个单元和模块只是按照功能逻辑进行划分的,但并不局限于上述的划分,只要能够实现相应的功能即可;另外,各功能单元的具体名称也只是为了便于相互区分,并不用于限制本发明的保护范围。

注意,上述仅为本发明的较佳实施例及所运用技术原理。本领域技术人员会理解,本发明不限于这里所述的特定实施例,对本领域技术人员来说能够进行各种明显的变化、重新调整和替代而不会脱离本发明的保护范围。因此,虽然通过以上实施例对本发明进行了较为详细的说明,但是本发明不仅仅限于以上实施例,在不脱离本发明构思的情况下,还可以包括更多其他等效实施例,而本发明的范围由所附的权利要求范围决定。

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