数据库表的加锁方法、装置、存储介质和电子设备与流程

文档序号:27831564发布日期:2021-12-07 22:25阅读:65来源:国知局
1.本发明涉及计算机领域,具体而言,涉及一种数据库表的加锁方法、装置、存储介质和电子设备。
背景技术
::2.现有技术中,在对数据库中的表进行访问的过程中,需要对表进行加锁,以免访问过程中其他用户对表进行访问造成冲突。3.然而,现有技术中,如果访问的表已经被加锁,则访问请求会夯住,一直处于等待状态,造成访问数据库的表的效率低。技术实现要素:4.本发明实施例提供了一种数据库表的加锁方法、装置、存储介质和电子设备,以至少解决访问数据库中的表的过程中夯住所造成的访问效率低的技术问题。5.根据本发明实施例的第一方面,提供了一种数据库表的加锁方法,包括:在获取到客户端请求对数据库中的目标表进行加锁的第一加锁请求的情况下,获取上述目标表的锁标志,其中,上述锁标志用于指示上述目标表的加锁类型;在上述锁标志为目标加锁标志的情况下,向上述客户端返回错误指令,其中,上述错误指令用于指示上述客户端访问上述目标表失败。6.根据本发明实施例的另一方面,提供了一种数据库表的加锁装置,包括:第一获取单元,用于在获取到客户端请求对数据库中的目标表进行加锁的第一加锁请求的情况下,获取上述目标表的锁标志,其中,上述锁标志用于指示上述目标表的加锁类型;第一返回单元,用于在上述锁标志为目标加锁标志的情况下,向上述客户端返回错误指令,其中,上述错误指令用于指示上述客户端访问上述目标表失败。7.根据本发明实施例的又一方面,还提供了一种存储介质,该存储介质中存储有计算机程序,其中,该计算机程序被设置为运行时执行上述数据库表的加锁方法。8.根据本发明实施例的又一方面,还提供了一种电子设备,包括存储器和处理器,上述存储器中存储有计算机程序,上述处理器被设置为通过上述计算机程序执行上述的数据库表的加锁方法。9.在本发明实施例中,采用了在获取到客户端请求对数据库中的目标表进行加锁的第一加锁请求的情况下,获取上述目标表的锁标志,其中,上述锁标志用于指示上述目标表的加锁类型;在上述锁标志为目标加锁标志的情况下,向上述客户端返回错误指令,其中,上述错误指令用于指示上述客户端访问上述目标表失败的方法,由于在上述方法中,在对数据库中的目标表进行访问的过程中,如果目标表已经被加锁,且加锁标志为目标加锁标志,则直接返回错误指令,指示客户端访问目标表失败,避免了客户端夯住一直等待的问题,提高了对数据库中的表的访问效率。附图说明10.此处所说明的附图用来提供对本发明的进一步理解,构成本技术的一部分,本发明的示意性实施例及其说明用于解释本发明,并不构成对本发明的不当限定。在附图中:11.图1是根据本发明实施例的一种可选的数据库表的加锁方法的流程图;12.图2是根据本发明实施例的一种可选的数据库表的加锁方法的不同类型锁的处理示意图;13.图3是根据本发明实施例的一种可选的数据库表的加锁方法的等待队列示意图;14.图4是根据本发明实施例的一种可选的数据库表的加锁方法的锁兼容示意图;15.图5是根据本发明实施例的另一种可选的数据库表的加锁方法的流程图;16.图6是根据本发明实施例的一种可选的数据库表的加锁装置的结构示意图。具体实施方式17.为了使本
技术领域
:的人员更好地理解本发明方案,下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分的实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都应当属于本发明保护的范围。18.需要说明的是,本发明的说明书和权利要求书及上述附图中的术语“第一”、“第二”等是用于区别类似的对象,而不必用于描述特定的顺序或先后次序。应该理解这样使用的数据在适当情况下可以互换,以便这里描述的本发明的实施例能够以除了在这里图示或描述的那些以外的顺序实施。此外,术语“包括”和“具有”以及他们的任何变形,意图在于覆盖不排他的包含,例如,包含了一系列步骤或单元的过程、方法、系统、产品或设备不必限于清楚地列出的那些步骤或单元,而是可包括没有清楚地列出的或对于这些过程、方法、产品或设备固有的其它步骤或单元。19.元数据锁(metadatalocking,简称为mdl)主要是保护表在并发访问时的安全性,它可以锁定表结构信息,也可以锁定表数据,在打开表的时候会加mdl读锁,如果更改表结构会加mdl写锁。在mysql中元数据锁有很多种类型,每种类型对应不同的使用场景。20.根据本发明实施例的第一方面,提供了一种数据库表的加锁方法,可选地,如图1所示,上述方法包括:21.s102,在获取到客户端请求对数据库中的目标表进行加锁的第一加锁请求的情况下,获取目标表的锁标志,其中,锁标志用于指示目标表的加锁类型;22.s104,在锁标志为目标加锁标志的情况下,向客户端返回错误指令,其中,错误指令用于指示客户端访问目标表失败。23.可选地,本实施例中的上述锁标志可以用于标记锁的类型。不同的锁标志可以标记不同的锁类型。数据库中的目标表可以被不同类型的锁进行加锁。不同类型的锁之间存在互斥或者兼容关系。互相兼容的锁可以同时对一个目标表进行加锁。互斥的锁无法同时对一个目标表进行加锁。24.可选地,本实施例中,可以在客户端请求访问数据库中的目标表的情况下,发起第一加锁请求。或者,本实施例中,还可以在对表进行迁移的过程中,发起第一加锁请求,对目标表进行加锁。25.例如,以表迁移为例进行说明。当对目标表进行迁移时,产生第一加锁指令,请求对目标表进行加锁。此时,获取目标表的锁标志,如果锁标志为目标加锁标志,则可以认为目标表已经被锁住,且锁是特定的锁。因此,此时不能响应第一加锁请求对表进行加锁并迁移。应向客户端返回错误指令,指示当前访问目标表失败,不能进行加锁。26.通过本实施例,通过在对数据库中的目标表进行访问的过程中,如果目标表已经被加锁,且加锁标志为目标加锁标志,则直接返回错误指令,指示客户端访问目标表失败,避免了客户端夯住一直等待的问题,提高了对数据库中的表的访问效率。27.作为一种可选的实施方式,上述方法还包括:28.在锁标志为第一加锁标志的情况下,获取目标表的锁状态;29.在锁状态为未加锁的情况下,将目标表的锁状态由未加锁的状态调整为已加锁的状态;30.向客户端返回提示消息,以使客户端访问目标表。31.可选地,本实施例中,可以通过锁标志来区分不同的锁。本实施例中,如果锁标志为目标加锁标志,则说明当前的目标表的锁是目标类型的锁。该类型的锁在锁住目标表后,其他互不兼容的锁无法锁住目标表,会立即反馈错误指令,避免等待。而如果锁标志为第一加锁标志,则说明此时目标表的锁为第一锁。获取第一锁的状态,查看锁状态为加锁状态还是未加锁状态。如果为未加锁状态,则可以对目标表进行加锁。加锁成功后,客户端可以访问目标表。32.例如,结合图2进行说明。如果目标表的锁标志为目标加锁标志,则反馈错误指令。如果为第一加锁标志,则获取加锁状态,根据加锁状态的不同执行不同的处理过程。33.作为一种可选的实施方式,上述方法还包括:34.在锁状态为已加锁的情况下,将第一加锁请求保存到等待队列中。35.可选地,本实施例中,如果目标表的锁的锁标志是第一加锁标志,则说明此时目标表的锁为第一锁。获取第一锁的状态,查看锁状态为加锁状态还是未加锁状态。如果锁状态为加锁状态,则说明当前的目标表已经被锁住。因此,可以将第一加锁请求保存到等待队列中。将第一加锁请求保存到等待队列中之后,等待目标表解锁后,再进行加锁。36.结合图3进行说明。当锁标志为第一加锁标志,且锁状态为已经加锁的情况下,将第一加锁请求保存到等待队列中。等待队列中已经有第三加锁请求,因此,第一加锁请求排序在第三加锁请求之后。37.作为一种可选的实施方式,上述方法还包括:38.解析第一加锁请求;39.在第一加锁请求为目标加锁请求的情况下,在锁状态为未加锁的情况下,将目标表的锁状态由未加锁的状态调整为已加锁的状态之后,将目标表的锁标志由第一加锁标志调整为目标加锁标志。40.可选地,本实施例中,在对目标表进行加锁之后,还需要修改目标表的锁标志和锁状态。41.本实施例中,由于不同的锁具备不同的锁标志,因此,可以在第一加锁请求中携带有加锁的锁标志的类型。如果第一加锁请求为目标加锁请求,则说明加锁的锁标志的类型为目标加锁标志。此时,可以对目标表添加目标锁,锁住目标表。锁住目标表之后,将目标表的锁的锁标志修改为目标加锁标志,并将锁状态修改为已加锁的状态。其他客户端请求加锁目标表时,会反馈错误指令,指示加锁失败。42.作为一种可选的实施方式,上述在获取到请求对数据库中的目标表进行加锁的第一加锁请求的情况下,获取目标表的锁标志包括:43.在获取到第一加锁请求之前,获取到请求对目标表进行加锁的第二加锁请求的情况下,将第二加锁请求保存到授予队列中;44.在第一加锁请求与第二加锁请求兼容的情况下,将第一加锁请求保存到授予队列并获取锁标志。45.作为一种可选的实施方式,上述方法还包括:46.在第一加锁请求与第二加锁请求不兼容的情况下,将第一加锁请求保存到等待队列中;47.在授予队列为空的情况下,将第一加锁请求从等待队列中转移到授予队列中,并获取锁标志。48.可选地,本实施例中,对于不同的加锁请求,首先可以查看加锁请求之间的锁是否可以兼容。如果可以兼容,则可以同时加锁。如果不同的锁之间不兼容,则需要按照先后顺序,首先处理第二加锁请求,然后处理第一加锁请求。结合图4进行说明。图4中,目标表的授予队列中,目标锁和第一锁是兼容的,可以同时加锁。而第二锁和第三锁互相兼容,但与目标锁或第一锁不兼容,因此,处于等待队列中。当目标锁与第一锁处理完成后,将第二锁与第三锁转移到授予队列中,对目标表进行加锁。49.图5是本实施例的一个流程图。本实施例中的元数据锁中可以带有特殊标记,如migrate标记。可以通过词解析获取关键词,通过生成语法分析器(yetanothercompilercompiler,简称为yacc)进行语法解析,解析关键词确定mdl锁类型。比较mdl锁和mdl锁等待队列与锁授予队列的兼容性。如果兼容,则查看mdl锁是否有migrate标记。当发现元数据锁带有migrate标记的时候,会直接返回错误而不再夯住进行等待。如果没有migrate标记,则判断锁状态为已加锁状态还是未加锁状态。如果为未加锁状态,则可以加锁。如果为已加锁状态,则进入等待队列等待。50.本实施例中可以在sql_yacc.yy文件对locktable的语法中,新增migrate选项,添加选项后,采用locktabletestmigrate语句进行加锁。其中的sql_yacc.yy文件是yacc语法分析器中的一个用于解析予以和语法的文件。文件中包括了locktable的语法。该locktable的语法是用于锁住表的语法。本实施例中,在locktable的语法中添加migrate选项,添加后的语法为locktabletestmigrate语句。通过该语句,可以锁住表。锁住的表带有migrate标志。51.如果是migrate选项,则加写锁,然后在元数据锁上打上migrate的标记,当其他会话请求元数据锁的是会发现上面带有migrate标记,则马上返回报错而不是一直夯住进行等待。52.通过本实施例,在mdl加锁流程中新增了一个标记来表明表是否被标记为正在迁移的表,如果标记成功,其他会话在对该表进行读写的时候会直接报错,错误信息:error1105(hy000):unknownerror。该错误信息表示出现了未知错误,错误代码为1105(hy000)。可以根据错误代码知晓或者查找错误类型。53.本实施例中,不同的表之间对于加锁互不干涉。以表为单位执行各自的加锁处理过程。在执行上述的locktabletestmigrate语句的时候,如果成功锁住表,则将该表的迁移标示至为true,表示表已经被锁住。在执行解锁命令unlocktables的时候将该表的迁移标示至为false,表示该表已经被解锁。54.需要说明的是,对于前述的各方法实施例,为了简单描述,故将其都表述为一系列的动作组合,但是本领域技术人员应该知悉,本发明并不受所描述的动作顺序的限制,因为依据本发明,某些步骤可以采用其他顺序或者同时进行。其次,本领域技术人员也应该知悉,说明书中所描述的实施例均属于优选实施例,所涉及的动作和模块并不一定是本发明所必须的。55.根据本发明实施例的另一方面,还提供了一种用于实施上述数据库表的加锁方法的装置,如图6所示,该装置包括:56.第一获取单元602,用于在获取到客户端请求对数据库中的目标表进行加锁的第一加锁请求的情况下,获取目标表的锁标志,其中,锁标志用于指示目标表的加锁类型;57.第一返回单元604,用于在锁标志为目标加锁标志的情况下,向客户端返回错误指令,其中,错误指令用于指示客户端访问目标表失败。58.可选地,本实施例中的上述锁标志可以用于标记锁的类型。不同的锁标志可以标记不同的锁类型。数据库中的目标表可以被不同类型的锁进行加锁。不同类型的锁之间存在互斥或者兼容关系。互相兼容的锁可以同时对一个目标表进行加锁。互斥的锁无法同时对一个目标表进行加锁。59.可选地,本实施例中,可以在客户端请求访问数据库中的目标表的情况下,发起第一加锁请求。或者,本实施例中,还可以在对表进行迁移的过程中,发起第一加锁请求,对目标表进行加锁。60.例如,以表迁移为例进行说明。当对目标表进行迁移时,产生第一加锁指令,请求对目标表进行加锁。此时,获取目标表的锁标志,如果锁标志为目标加锁标志,则可以认为目标表已经被锁住,且锁是特定的锁。因此,此时不能响应第一加锁请求对表进行加锁并迁移。应向客户端返回错误指令,指示当前访问目标表失败,不能进行加锁。61.通过本实施例,通过在对数据库中的目标表进行访问的过程中,如果目标表已经被加锁,且加锁标志为目标加锁标志,则直接返回错误指令,指示客户端访问目标表失败,避免了客户端夯住一直等待的问题,提高了对数据库中的表的访问效率。62.作为一种可选的实施方式,上述装置还包括:63.第二获取单元,用于在锁标志为第一加锁标志的情况下,获取目标表的锁状态;64.第一调整单元,用于在锁状态为未加锁的情况下,将目标表的锁状态由未加锁的状态调整为已加锁的状态;65.第二返回单元,用于向客户端返回提示消息,以使客户端访问目标表。66.可选地,本实施例中,可以通过锁标志来区分不同的锁。本实施例中,如果锁标志为目标加锁标志,则说明当前的目标表的锁是目标类型的锁。该类型的锁在锁住目标表后,其他互不兼容的锁无法锁住目标表,会立即反馈错误指令,避免等待。而如果锁标志为第一加锁标志,则说明此时目标表的锁为第一锁。获取第一锁的状态,查看锁状态为加锁状态还是未加锁状态。如果为未加锁状态,则可以对目标表进行加锁。加锁成功后,客户端可以访问目标表。67.作为一种可选的实施方式,上述装置还包括:68.第一保存单元,用于在锁状态为已加锁的情况下,将第一加锁请求保存到等待队列中。69.可选地,本实施例中,如果目标表的锁的锁标志是第一加锁标志,则说明此时目标表的锁为第一锁。获取第一锁的状态,查看锁状态为加锁状态还是未加锁状态。如果锁状态为加锁状态,则说明当前的目标表已经被锁住。因此,可以将第一加锁请求保存到等待队列中。将第一加锁请求保存到等待队列中之后,等待目标表解锁后,再进行加锁。70.作为一种可选的实施方式,上述装置还包括:71.解析单元,用于解析第一加锁请求;72.第二调整单元,用于在第一加锁请求为目标加锁请求的情况下,在锁状态为未加锁的情况下,将目标表的锁状态由未加锁的状态调整为已加锁的状态之后,将目标表的锁标志由第一加锁标志调整为目标加锁标志。73.可选地,本实施例中,在对目标表进行加锁之后,还需要修改目标表的锁标志和锁状态。74.本实施例中,由于不同的锁具备不同的锁标志,因此,可以在第一加锁请求中携带有加锁的锁标志的类型。如果第一加锁请求为目标加锁请求,则说明加锁的锁标志的类型为目标加锁标志。此时,可以对目标表添加目标锁,锁住目标表。锁住目标表之后,将目标表的锁的锁标志修改为目标加锁标志,并将锁状态修改为已加锁的状态。其他客户端请求加锁目标表时,会反馈错误指令,指示加锁失败。75.作为一种可选的实施方式,上述第一获取单元包括:76.第二保存单元,用于在获取到第一加锁请求之前,获取到请求对目标表进行加锁的第二加锁请求的情况下,将第二加锁请求保存到授予队列中;77.第三保存单元,用于在第一加锁请求与第二加锁请求兼容的情况下,将第一加锁请求保存到授予队列并获取锁标志。78.作为一种可选的实施方式,上述装置还包括:79.第四保存单元,用于在第一加锁请求与第二加锁请求不兼容的情况下,将第一加锁请求保存到等待队列中;80.转移单元,用于在授予队列为空的情况下,将第一加锁请求从等待队列中转移到授予队列中,并获取锁标志。81.本实施例的其他示例请参见上述示例,在此不再赘述。82.可选地,本实施例中,对于不同的加锁请求,首先可以查看加锁请求之间的锁是否可以兼容。如果可以兼容,则可以同时加锁。如果不同的锁之间不兼容,则需要按照先后顺序,首先处理第二加锁请求,然后处理第一加锁请求。结合图4进行说明。图4中,目标表的授予队列中,目标锁和第一锁是兼容的,可以同时加锁。而第二锁和第三锁互相兼容,但与目标锁或第一锁不兼容,因此,处于等待队列中。当目标锁与第一锁处理完成后,将第二锁与第三锁转移到授予队列中,对目标表进行加锁。83.图5是本实施例的一个流程图。本实施例中的元数据锁中可以带有特殊标记,如migrate标记。可以通过词解析获取关键词,通过生成语法分析器(yetanothercompilercompiler,简称为yacc)进行语法解析,解析关键词确定mdl锁类型。比较mdl锁和mdl锁等待队列与锁授予队列的兼容性。如果兼容,则查看mdl锁是否有migrate标记。当发现元数据锁带有migrate标记的时候,会直接返回错误而不再夯住进行等待。如果没有migrate标记,则判断锁状态为已加锁状态还是未加锁状态。如果为未加锁状态,则可以加锁。如果为已加锁状态,则进入等待队列等待。84.本实施例中可以在sql_yacc.yy文件对locktable的语法中,新增migrate选项,添加选项后,采用locktabletestmigrate语句进行加锁。其中的sql_yacc.yy文件是yacc语法分析器中的一个用于解析予以和语法的文件。文件中包括了locktable的语法。该locktable的语法是用于锁住表的语法。本实施例中,在locktable的语法中添加migrate选项,添加后的语法为locktabletestmigrate语句。通过该语句,可以锁住表。锁住的表带有migrate标志。85.如果是migrate选项,则加写锁,然后在元数据锁上打上migrate的标记,当其他会话请求元数据锁的是会发现上面带有migrate标记,则马上返回报错而不是一直夯住进行等待。86.通过本实施例,在mdl加锁流程中新增了一个标记来表明表是否被标记为正在迁移的表,如果标记成功,其他会话在对该表进行读写的时候会直接报错,错误信息:error1105(hy000):unknownerror。该错误信息表示出现了未知错误,错误代码为1105(hy000)。可以根据错误代码知晓或者查找错误类型。87.本实施例中,不同的表之间对于加锁互不干涉。以表为单位执行各自的加锁处理过程。在执行上述的locktabletestmigrate语句的时候,如果成功锁住表,则将该表的迁移标示至为true,表示表已经被锁住。在执行解锁命令unlocktables的时候将该表的迁移标示至为false,表示该表已经被解锁。88.根据本发明实施例的又一方面,还提供了一种用于实施上述数据库表的加锁方法的电子设备,该电子设备可以包括存储器和处理器,该存储器中存储有计算机程序,该处理器被设置为通过计算机程序执行上述数据库表的加锁方法实施例中的步骤。89.根据本发明的实施例的又一方面,还提供了一种计算机可读的存储介质,该计算机可读的存储介质中存储有计算机程序,其中,该计算机程序被设置为运行时执行上述数据库表的加锁方法实施例中的步骤。90.可选地,在本实施例中,本领域普通技术人员可以理解上述实施例的各种方法中的全部或部分步骤是可以通过程序来指令终端设备相关的硬件来完成,该程序可以存储于一计算机可读存储介质中,存储介质可以包括:闪存盘、只读存储器(read‑onlymemory,rom)、随机存取器(randomaccessmemory,ram)、磁盘或光盘等。91.上述本发明实施例序号仅仅为了描述,不代表实施例的优劣。92.上述实施例中的集成的单元如果以软件功能单元的形式实现并作为独立的产品销售或使用时,可以存储在上述计算机可读取的存储介质中。基于这样的理解,本发明的技术方案本质上或者说对现有技术做出贡献的部分或者该技术方案的全部或部分可以以软件产品的形式体现出来,该计算机软件产品存储在存储介质中,包括若干指令用以使得一台或多台计算机设备(可为个人计算机、服务器或者网络设备等)执行本发明各个实施例方法的全部或部分步骤。93.在本发明的上述实施例中,对各个实施例的描述都各有侧重,某个实施例中没有详述的部分,可以参见其他实施例的相关描述。94.在本技术所提供的几个实施例中,应该理解到,所揭露的客户端,可通过其它的方式实现。其中,以上所描述的装置实施例仅仅是示意性的,例如单元的划分,仅仅为一种逻辑功能划分,实际实现时可以有另外的划分方式,例如多个单元或组件可以结合或者可以集成到另一个系统,或一些特征可以忽略,或不执行。另一点,所显示或讨论的相互之间的耦合或直接耦合或通信连接可以是通过一些接口,单元或模块的间接耦合或通信连接,可以是电性或其它的形式。95.所述作为分离部件说明的单元可以是或者也可以不是物理上分开的,作为单元显示的部件可以是或者也可以不是物理单元,即可以位于一个地方,或者也可以分布到多个网络单元上。可以根据实际的需要选择其中的部分或者全部单元来实现本实施例方案的目的。96.另外,在本发明各个实施例中的各功能单元可以集成在一个处理单元中,也可以是各个单元单独物理存在,也可以两个或两个以上单元集成在一个单元中。上述集成的单元既可以采用硬件的形式实现,也可以采用软件功能单元的形式实现。97.以上所述仅是本发明的优选实施方式,应当指出,对于本
技术领域
:的普通技术人员来说,在不脱离本发明原理的前提下,还可以做出若干改进和润饰,这些改进和润饰也应视为本发明的保护范围。当前第1页12当前第1页12
当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1