具体实施方式
为使本申请的目的、技术方案和优点更加清楚,下面将结合本申请具体实施例及相应的附图对本申请技术方案进行清楚、完整地描述。显然,所描述的实施例仅是本申请一部分实施例,而不是全部的实施例。基于本申请中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本申请保护的范围。
以下结合附图,详细说明本申请各实施例提供的技术方案。
图1是本申请的一个实施例数据库死锁的处理方法流程图。图1的方法由处理数据库死锁的装置执行。在实际的应用中,该处理数据库死锁的装置可以是数据库系统的一个功能模块。该方法包括:
S110,将事务划分成顺序执行的N个子事务。
其中,N为大于1的正整数。
事务(Transaction)是访问并可能更新数据库中各种数据项的一个程序执行单元(unit)。事务由事务开始(begin transaction)和事务结束(end transaction)之间执行的全体操作组成。例如:在关系数据库中,一个事务可以是一条结构化查询语言(StructuredQuery Language,SQL)语句,一组SQL语句或整个程序。
应理解,在本申请中,该事务包含多条插入(Insert)、更新(Update)或删除(Delete)的SQL语句等涉及数据库修改的数据库操纵语句,能够进一步划分为多个子事务。
例如,假设该事务由以下SQL语句组成:
delete from table1where col1=”value1”;
insert into table2values(value1,value2,value3……);
update table3set col2=”value4”where col3=“value5”。
该事务可以进一步划分为多个子事务。
例如,该事务可以分为子事务1和子事务2,其中,
子事务1为:
delete from table1where col1=”value1”;
insert into table2values(value1,value2,value3……);
子事务2为:
update table3set col2=”value4”where col3=“value5”。
又例如,该事务还可以分为子事务1、子事务2和子事务3,其中,
子事务1为:
delete from table1where col1=”value1”;
子事务2为:
insert into table2values(value1,value2,value3……);
子事务3为:
update table3set col2=”value4”where col3=“value5”。
在具体的应用中,可以根据其中的SQL语句的多少进行子事务的划分,或者根据需要进行插入(Insert)、更新(Update)或删除(Delete)的记录的数量进行子事务的划分,或者根据预先估计的执行时间进行子事务的划分,等待,本申请在此不做限制。
S120,在该N个子事务中的每一个子事务执行之前创建保存点。
保存点(savepoint)是事务过程中的一个逻辑点,通过保存点可以把事务回退到保存点的状态,而不必回退整个事务。
创建保存点的方式可参考现有技术。例如,在Oracle数据库中,可通过savepointsavepoint_name这条命令创建保存点。其中,savepoint_name表示保存点名称。
S130,顺序执行该N个子事务。
S140,当该N个子事务中的第n个子事务发生锁等待且等待时间大于该第n个子事务对应的第一等待时间时,将该待处理事务回滚到回滚保存点。
其中,n为小于或等于N的正整数,该回滚保存点为执行该第n个子事务之前创建的一个保存点。
应理解,本申请的第n个子事务,是指该N个子事务中顺序执行的第n个子事务。
S150,继续顺序执行该N个子事务中在该回滚保存点之后的子事务。
在本申请实施例中,通过将事务拆分成多个子事务并在执行前设置保存点,在其中的子事务发生锁等待超过该子事务对应的第一等待时间后回滚到该子事务之前的保存点并继续执行,从而能够在一定程度提高发生死锁的事务的执行效率。
在步骤S140中,该回滚保存点是在执行第n个子事务之前创建的保存点。该回滚保存点的选择决定了该事务需要回滚的子事务的数量。因此,在步骤S140之前,该方法还可包括:确定该回滚保存点。
可选地,作为一个实施例,确定该回滚保存点具体可实现为:当该N个子事务中的第n个子事务第i次发生锁等待且等待时间大于该第n个子事务对应的第一等待时间,根据第i次锁等待对应的需要回滚的子事务个数s,确定该回滚保存点,s与i的映射关系是预设的,i、s都为正整数。
应理解,s与i的映射关系是预设的,例如可以预先设定s与i的映射关系表,或者,预先设定s与i之间的函数关系,等等。
具体地,例如,s与i的映射关系表可如表1所示:
表1:
锁等待次数 |
1 |
2 |
3 |
4 |
5 |
需要回滚的子事务个数 |
1 |
2 |
3 |
5 |
8 |
或者,例如,可规定s与i的函数关系为s=i。
当然,应理解,上述列举的映射关系表和函数关系仅仅是示意性的,在实际的应用中,可根据实际情况进行设置。
此外,应理解,由于上述需要回滚的子事务个数s可能大于当前已经执行的子事务的个数n,因此,当s<n时,可确定需要回滚s个子事务;当s≥n,可确定需要回滚n个子事务。换句话说,当s<n时,确定第n-s+1个子事务之前的第一个保存点为该回滚保存点;或者,当s≥n时,确定第1个子事务之前的保存点为该回滚保存点。
在本实现方式中,通过根据子事务发生锁等待且等待时间大于第一等待时间的次数,确定需要回滚的子事务的个数,进而确定回滚的保存点,从而能够避免因回滚的子事务设置过少而无法释放锁,或者因回滚的子事务设置过多而导致不必要的事务回滚。
当然,应理解,上述实现方式只是示出了一种可能的实现方式,在具体的应用中,还可通过其它方式确定回滚保存点。
应理解,该N个子事务中每个子事务发生锁等待对应的第一等待时间可以相同,也可以不同。
可选地,该第一等待时间可以是数据库的用户设置的。用户可为第一等待时间设定一个固定值,或者,或者根据某种配置规则设定该第一等待时间。根据参数设置第一等待时间,例如,根据第n个子事务的涉及的数据操作类型、所述第n个子事务涉及的数据操作的记录数、所述第n个子事务的序号n以及所述第n个子事务发生锁等待的次数中的至少一种参数,设置第一等待时间。
或者,可选地,作为另一个实施例,该第一等待时间是根据随机数设置的。通过随机数设置第一等待时间,可以防止所有连接超时都是一样的。
在本申请实施例中,通过灵活设置子事务发生锁等待的第一等待时间,可以无需用户干预死锁进程,提高数据库的执行效率。
在本申请实施例中,通过灵活设置第n个子事务发生锁等待的第一等待时间,能够在使得子事务回滚后释放锁的前提下,一定程度上减少回滚的子事务的数量。
可选地,作为一个实施例,步骤S150具体可实现为:在回滚到该回滚保存点且等待第二等待时间之后,继续顺序执行该N个子事务中在该回滚保存点之后的子事务。
可选地,该第二等待时间可以是数据库的用户设置的。用户可为第二等待时间设定一个固定值,或者根据某种配置规则设定该第二等待时间。
或者,可选地,第二等待时间是根据该事务所涉及的SQL类型确定的。例如,数据定义语言(Data Definition Language,DDL)类型的第二等待时间可以设置长一些;数据操纵语言(data manipulation language,DML)的第二等待时间可以设置短一些,等等。
或者,可选地,该第二等待时间是根据随机数设置的。通过随机数设置第二等待时间,可以防止所有连接超时都是一样的。
在本申请实施例中,通过在回滚到该回滚保存点后等待第二等待时间,能够在一定程度上避免持有第n个子事务的锁的事务未释放该锁而导致该第n个子事务继续发生锁等待,进一步提高发生死锁的事务的执行效率。
可选地,作为一个实施例,该方法还包括:在创建该N个子事务中的每一个子事务对应的保存点时,按顺序记录该保存点;在将该事务回滚到该回滚保存点时,删除该回滚保存点之后创建的保存点的记录。
删除保存点的操作可参考现有技术,例如,在Oracle数据库中,可以通过releasesavepoint命令删除创建的保存点。具体的命令格式如下
release savepoint savepoint_name;
其中,savepoint_name表示创建的保存点的名称。
此外,如果保存点的记录存储于某个链表或其它数据结构中,则还需要从该链表或数据结构中删除该回滚保存点之后创建的保存点的记录。
在本申请实施例中,通过删除回滚保存点之后的保存点的记录,使得处理数据库死锁的装置在后续的确定回滚的保存点的操作中能够迅速定位回滚的保存点。
当该保存点需要另外进行记录时,可选地,该N个子事务中的每一个子事务在执行之前创建的保存点可按先后顺序存储于链表中,其中,该回滚保存点是通过查找该链表确定的。
在本申请实施例中,通过链表查找需要回滚的回滚保存点,能够提高查找回滚保存点的效率,从而能够进一步提高发生死锁的事务的执行效率。
或者,可选地,作为另一个实施例,该N个子事务中的每一个子事务在执行之前创建的保存点是按照保存点的序号和预定规则命名的,该回滚保存点是根据该回滚保存点的序号和该预定规则确定的。
应理解,保存点的记录不是必须的。例如,可以约定保存点的命名规则为标识名+序号,则当确定回滚保存点的序号后,即可确定回滚保存点的名称,从而找到该保存点。
当然,应理解,在实际的应用中,可能只记录保存点的信息,而不会记录回滚的子事务的个数。但是,由于每一个子事务之前都有一个对应的保存点,确定需要回滚的子事务,也就等价于确定回滚的保存点。
下面,将结合具体的实施例,对本申请图1所示的实施例做进一步的描述。
图2是本申请的一个实施例数据库死锁的具体处理方法流程图。在图2所示的场景中,事务可分成子事务1、子事务2和子事务3共3个子事务,其执行顺序按照子事务1、子事务2和子事务3顺序执行。如图2所示,在执行子事务1之前,建立保存点savepoint1;在执行子事务2之前,建立保存点savepoint2;在执行子事务2之前,建立保存点savepoint3。
图2所示实施例中,假设事务执行到子事务3时,发生锁等待。
如果执行子事务3第1次发生锁等待且超出第一次锁等待对应的等待时间,需要回滚的子事务数s取值为1,该次回滚需要回滚到第3-1+1=3个子事务之前的第一个保存点,也即回滚到子事务3之前的第一个保存点savepoint3。同时,数据库需要释放savepoint3之后的锁。
如果执行子事务3第2次发生锁等待且超出第一次锁等待对应的等待时间,需要回滚的子事务数s取值为2,该次回滚需要回滚到第3-2+1=2个子事务之前的第一个保存点,也即回滚到子事务2之前的第一个保存点savepoint2。同时,数据库需要释放savepoint2之后的锁。此外,如果本申请实施例中使用链表等记录保存点,则还需要删除savepoint2之后的保存点记录。
如果执行子事务3第3次发生锁等待且超出第一次锁等待对应的等待时间,则需要回滚的子事务数s取值为3,该次回滚需要回滚到第3-3+1=1个子事务之前的第一个保存点,也即回滚到子事务1之前的第一个保存点savepoint1。同时,数据库需要释放savepoint3之后的锁。此外,如果本申请实施例中使用链表等记录保存点,则还需要删除savepoint3之后的保存点记录。
当然,应理解,如图2所示,可以通过链表保存每个子事务执行前创建的保存点的标识。图2中的3个子事务在执行之前创建的保存点按先后顺序存储于链表中,分别对应执行计划1、执行计划2和执行计划3。数据库可根据需要回滚的子事务的个数,从链表中找到对应的保存点的标识。
此外,应理解,在图2所示的场景中,也可以不用链表记录保存点的信息,而是规定保存点的命名规则。例如,可以规定图2中保存点的命名规则为“savepoint”+序号。在第一次回滚时,需要回滚的保存点的序号为3-1+1=3,根据该命名规则即可确定该保存点为savepoint3,等等。
另外,对于用于判断是否超时的锁等待的等待时间,可以规定每次锁等待的等待时间相同,或者根据锁等待发生超时的次数、锁等待发生时的子事务的序号、锁等待发生时的子事务涉及的数据操作类型、或者是锁等待发生时的子事务涉及的数据操作的记录数等因素,综合确定锁等待的等待时间。此外,也可以根据随机数,随机分配所等待的等待时间。
此外,每次发生回滚后,还可设定一个等待时间,当回滚后经过该等待时间后,再继续执行子事务,可避免持有本事务的锁的事务未能及时释放掉该锁而导致本事务继续发生锁等待。
需要说明的是,上述如图1所示实施例所提供方法的各步骤的执行主体均可以是同一设备,或者,该方法也由不同设备作为执行主体。比如,步骤S110和步骤S120的执行主体可以为设备1,步骤S130的执行主体可以为设备2;又比如,步骤S110的执行主体可以为设备1,步骤S120和步骤S130的执行主体可以为设备2;等等。
图3是本本申请的一个实施例电子设备的结构示意图。请参考图3,在硬件层面,该电子设备包括处理器、内部总线、网络接口、内存以及非易失性存储器,当然还可能包括其他业务所需要的硬件。处理器从非易失性存储器中读取对应的计算机程序到内存中然后运行,在逻辑层面上形成用户界面解锁的装置。当然,除了软件实现方式之外,本申请并不排除其他实现方式,比如逻辑器件抑或软硬件结合的方式等等,也就是说以下处理流程的执行主体并不限定于各个逻辑单元,也可以是硬件或逻辑器件。
图4是本申请的一个实施例的处理数据库死锁的装置400的结构示意图。应理解,处理数据库死锁的装置400可以是数据库系统,或者是数据库系统中的一个具体的实现模块,本申请实施例在此不作限制。请参考图4,在软件实施方式中,该数据库死锁的装置400可包括:事务划分单元410、保存点创建单元420、执行单元430和事务回滚单元440。其中,
事务划分单元410将事务划分成顺序执行的N个子事务,其中,N为大于1的正整数;
保存点创建单元420在执行该N个子事务中的每一个子事务之前创建保存点;
执行单元430顺序执行该N个子事务;
当该N个子事务中的第n个子事务发生锁等待且等待时间大于该第n个子事务对应的第一等待时间时,事务回滚单元440将该事务回滚到回滚保存点,其中,n为小于等于N的正整数,该回滚保存点为执行该第n个子事务之前创建的一个保存点;
执行单元430还在该事务回滚单元440将该待执行事务回滚到该第一保存点之后,继续顺序执行该N个子事务中在该第一保存点之后的子事务。
在本申请实施例中,通过将事务拆分成多个子事务并在执行前设置保存点,在其中的子事务发生锁等待超过该子事务对应的第一等待时间后回滚到该子事务之前的保存点并继续执行,从而能够在一定程度提高发生死锁的事务的执行效率。
图5是本申请的另一个实施例的处理数据库死锁的装置400的结构示意图。可选地,如图5所示,装置400还可包括确定单元450,当该N个子事务中的第n个子事务第i次发生锁等待且等待时间大于该第n个子事务对应的第一等待时间,该确定单元450根据第i次锁等待对应的需要回滚的子事务个数s,确定该回滚保存点,s与i的映射关系是预设的,i、s都为正整数。
进一步地,确定单元450根据第i次锁等待对应的需要回滚的子事务个数s,确定该回滚保存点包括:确定单元450可确定第n-s个子事务之前的第一个保存点为该第一保存点,其中,s<n;或者,确定单元45可确定第1个子事务之前的保存点为该第一保存点,其中,s≥n。
可选地,该第一等待时间是该事务所在的数据库系统的用户设置的;或者,该第一等待时间是按照随机数设置的。
可选地,执行单元430具体在回滚到该第一保存点且等待第二等待时间之后,继续顺序执行该N个子事务中在该第一保存点之后的子事务。进一步地,该第二等待时间是根据该事务所涉及的结构化查询语言SQL类型设定的;或者,该第二等待时间是该事务所在的数据库系统的用户设置的;或者,该第二等待时间按照随机数设置的。
可选地,作为一个实施例,该N个子事务中的每一个子事务在执行之前创建的保存点是根据保存点的序号和预定规则命名的,该回滚保存点是根据该回滚保存点的序号和该预定规则确定的。
或者,可选地,作为另一个实施例,该N个子事务中的每一个子事务在执行之前创建的保存点按先后顺序存储于链表中,该回滚保存点是通过查找该链表确定的。进一步地,如图5所示,装置400还可包括删除单元460。如果保存点创建单元在创建该N个子事务中的每一个子事务对应的保存点时,还按顺序记录该保存点;则该删除单元可在该事务回滚单元将该事务回滚到该回滚保存点时,删除该回滚保存点之后创建的保存点的记录。
处理数据库死锁的装置400还可执行图1的方法,并实现数据库或处理数据库死锁的装置在图1、图2所示实施例的功能,本申请实施例在此不再赘述。
本申请还公开了一种数据库系统,包括图4或图5所示实施例的处理数据库死锁的装置400。
在20世纪90年代,对于一个技术的改进可以很明显地区分是硬件上的改进(例如,对二极管、晶体管、开关等电路结构的改进)还是软件上的改进(对于方法流程的改进)。然而,随着技术的发展,当今的很多方法流程的改进已经可以视为硬件电路结构的直接改进。设计人员几乎都通过将改进的方法流程编程到硬件电路中来得到相应的硬件电路结构。因此,不能说一个方法流程的改进就不能用硬件实体模块来实现。例如,可编程逻辑器件(Programmable Logic Device,PLD)(例如现场可编程门阵列(Field Programmable GateArray,FPGA))就是这样一种集成电路,其逻辑功能由用户对器件编程来确定。由设计人员自行编程来把一个数字系统“集成”在一片PLD上,而不需要请芯片制造厂商来设计和制作专用的集成电路芯片。而且,如今,取代手工地制作集成电路芯片,这种编程也多半改用“逻辑编译器(logic compiler)”软件来实现,它与程序开发撰写时所用的软件编译器相类似,而要编译之前的原始代码也得用特定的编程语言来撰写,此称之为硬件描述语言(Hardware Description Language,HDL),而HDL也并非仅有一种,而是有许多种,如ABEL(Advanced Boolean Expression Language)、AHDL(Altera Hardware DescriptionLanguage)、Confluence、CUPL(Cornell University Programming Language)、HDCal、JHDL(Java Hardware Description Language)、Lava、Lola、MyHDL、PALASM、RHDL(RubyHardware Description Language)等,目前最普遍使用的是VHDL(Very-High-SpeedIntegrated Circuit Hardware Description Language)与Verilog。本领域技术人员也应该清楚,只需要将方法流程用上述几种硬件描述语言稍作逻辑编程并编程到集成电路中,就可以很容易得到实现该逻辑方法流程的硬件电路。
控制器可以按任何适当的方式实现,例如,控制器可以采取例如微处理器或处理器以及存储可由该(微)处理器执行的计算机可读程序代码(例如软件或固件)的计算机可读介质、逻辑门、开关、专用集成电路(Application Specific Integrated Circuit,ASIC)、可编程逻辑控制器和嵌入微控制器的形式,控制器的例子包括但不限于以下微控制器:ARC 625D、Atmel AT91SAM、Microchip PIC18F26K20以及Silicone Labs C8051F320,存储器控制器还可以被实现为存储器的控制逻辑的一部分。本领域技术人员也知道,除了以纯计算机可读程序代码方式实现控制器以外,完全可以通过将方法步骤进行逻辑编程来使得控制器以逻辑门、开关、专用集成电路、可编程逻辑控制器和嵌入微控制器等的形式来实现相同功能。因此这种控制器可以被认为是一种硬件部件,而对其内包括的用于实现各种功能的装置也可以视为硬件部件内的结构。或者甚至,可以将用于实现各种功能的装置视为既可以是实现方法的软件模块又可以是硬件部件内的结构。
上述实施例阐明的系统、装置、模块或单元,具体可以由计算机芯片或实体实现,或者由具有某种功能的产品来实现。一种典型的实现设备为计算机。具体的,计算机例如可以为个人计算机、膝上型计算机、蜂窝电话、相机电话、智能电话、个人数字助理、媒体播放器、导航设备、电子邮件设备、游戏控制台、平板计算机、可穿戴设备或者这些设备中的任何设备的组合。
为了描述的方便,描述以上装置时以功能分为各种单元分别描述。当然,在实施本申请时可以把各单元的功能在同一个或多个软件和/或硬件中实现。
本领域内的技术人员应明白,本申请的实施例可提供为方法、系统、或计算机程序产品。因此,本申请可采用完全硬件实施例、完全软件实施例、或结合软件和硬件方面的实施例的形式。而且,本申请可采用在一个或多个其中包含有计算机可用程序代码的计算机可用存储介质(包括但不限于磁盘存储器、CD-ROM、光学存储器等)上实施的计算机程序产品的形式。
本申请是参照根据本申请实施例的方法、设备(系统)、和计算机程序产品的流程图和/或方框图来描述的。应理解可由计算机程序指令实现流程图和/或方框图中的每一流程和/或方框、以及流程图和/或方框图中的流程和/或方框的结合。可提供这些计算机程序指令到通用计算机、专用计算机、嵌入式处理机或其他可编程数据处理设备的处理器以产生一个机器,使得通过计算机或其他可编程数据处理设备的处理器执行的指令产生用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的装置。
这些计算机程序指令也可存储在能引导计算机或其他可编程数据处理设备以特定方式工作的计算机可读存储器中,使得存储在该计算机可读存储器中的指令产生包括指令装置的制造品,该指令装置实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能。
这些计算机程序指令也可装载到计算机或其他可编程数据处理设备上,使得在计算机或其他可编程设备上执行一系列操作步骤以产生计算机实现的处理,从而在计算机或其他可编程设备上执行的指令提供用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的步骤。
在一个典型的配置中,计算设备包括一个或多个处理器(CPU)、输入/输出接口、网络接口和内存。
内存可能包括计算机可读介质中的非永久性存储器,随机存取存储器(RAM)和/或非易失性内存等形式,如只读存储器(ROM)或闪存(flash RAM)。内存是计算机可读介质的示例。
计算机可读介质包括永久性和非永久性、可移动和非可移动媒体可以由任何方法或技术来实现信息存储。信息可以是计算机可读指令、数据结构、程序的模块或其他数据。计算机的存储介质的例子包括,但不限于相变内存(PRAM)、静态随机存取存储器(SRAM)、动态随机存取存储器(DRAM)、其他类型的随机存取存储器(RAM)、只读存储器(ROM)、电可擦除可编程只读存储器(EEPROM)、快闪记忆体或其他内存技术、只读光盘只读存储器(CD-ROM)、数字多功能光盘(DVD)或其他光学存储、磁盒式磁带,磁带磁磁盘存储或其他磁性存储设备或任何其他非传输介质,可用于存储可以被计算设备访问的信息。按照本文中的界定,计算机可读介质不包括暂存电脑可读媒体(transitory media),如调制的数据信号和载波。
还需要说明的是,术语“包括”、“包含”或者其任何其他变体意在涵盖非排他性的包含,从而使得包括一系列要素的过程、方法、商品或者设备不仅包括那些要素,而且还包括没有明确列出的其他要素,或者是还包括为这种过程、方法、商品或者设备所固有的要素。在没有更多限制的情况下,由语句“包括一个……”限定的要素,并不排除在包括所述要素的过程、方法、商品或者设备中还存在另外的相同要素。
本领域技术人员应明白,本申请的实施例可提供为方法、系统或计算机程序产品。因此,本申请可采用完全硬件实施例、完全软件实施例或结合软件和硬件方面的实施例的形式。而且,本申请可采用在一个或多个其中包含有计算机可用程序代码的计算机可用存储介质(包括但不限于磁盘存储器、CD-ROM、光学存储器等)上实施的计算机程序产品的形式。
本申请可以在由计算机执行的计算机可执行指令的一般上下文中描述,例如程序模块。一般地,程序模块包括执行特定任务或实现特定抽象数据类型的例程、程序、对象、组件、数据结构等等。也可以在分布式计算环境中实践本申请,在这些分布式计算环境中,由通过通信网络而被连接的远程处理设备来执行任务。在分布式计算环境中,程序模块可以位于包括存储设备在内的本地和远程计算机存储介质中。
本说明书中的各个实施例均采用递进的方式描述,各个实施例之间相同相似的部分互相参见即可,每个实施例重点说明的都是与其他实施例的不同之处。尤其,对于系统实施例而言,由于其基本相似于方法实施例,所以描述的比较简单,相关之处参见方法实施例的部分说明即可。
以上所述仅为本申请的实施例而已,并不用于限制本申请。对于本领域技术人员来说,本申请可以有各种更改和变化。凡在本申请的精神和原理之内所作的任何修改、等同替换、改进等,均应包含在本申请的权利要求范围之内。