发明内容
为了解决现有技术中存在无法避免不同操作的线程并发访问同一数据库的问题,本申请提供了一种避免线程并发访问数据库的方法和装置具体是这样实现的:
一种避免线程并发访问数据库的方法,所述方法包括:
当预设业务程序的第一线程和第二线程同时访问预设数据库时,获取所述预设业务程序的互斥锁池;其中,所述互斥锁池中存储有将所述预设业务程序的指定要素进行遍历组合得到的多种互斥锁;
判断所述第一线程的互斥锁和第二线程的互斥锁是否同时位于所述互斥锁池中;
若是,则判定所述第一线程和第二线程不能同时访问所述预设数据库。
一种避免线程并发访问数据库的方法,所述方法包括:
当预设业务程序的第一线程访问预设数据库时,获取所述预设业务程序的互斥锁池,以及所述互斥锁池对应的适配互斥锁;其中,所述互斥锁池中存储有将所述预设业务程序的指定要素进行遍历组合得到的多种互斥锁;
若所述第一线程的互斥锁位于所述互斥锁池中,则将所述第一线程的互斥锁转换为所述互斥锁池对应的适配互斥锁,并将所述第一线程的适配互斥锁插入所述预设数据库中;
当所述预设业务程序的第二线程访问所述预设数据库时,判断所述第二线程的互斥锁是否位于所述互斥锁池中;
若是,则将所述第二线程的互斥锁转换为所述互斥锁池对应的适配互斥锁,并将所述第二线程的所述适配互斥锁与所述预设数据库中已插入的所述适配互斥锁进行比较;
若判定所述第二线程的所述适配互斥锁与所述预设数据库中的所述适配互斥锁互斥,则所述第二线程不能访问所述预设数据库。
一种避免线程并发访问数据库的装置,所述装置包括:
第一获取模块,用于当预设业务程序的第一线程和第二线程同时访问预设数据库时,获取所述预设业务程序的互斥锁池;其中,所述互斥锁池中存储有将所述预设业务程序的指定要素进行遍历组合得到的多种互斥锁;
判断模块,用于判断所述第一线程的互斥锁和第二线程的互斥锁是否同时位于所述互斥锁池中;
处理模块,用于在所述第一线程的互斥锁和第二线程的互斥锁同时位于所述互斥锁池中时,判定所述第一线程和第二线程不能同时访问所述预设数据库。
一种避免线程并发访问数据库的装置,所述装置包括:
第一获取模块,用于当预设业务程序的第一线程访问预设数据库时,获取所述预设业务程序的互斥锁池,以及所述互斥锁池对应的适配互斥锁;其中,所述互斥锁池中存储有将所述预设业务程序的指定要素进行遍历组合得到的多种互斥锁;
第一转换模块,用于若所述第一线程的互斥锁位于所述互斥锁池中,则将所述第一线程的互斥锁转换为所述互斥锁池对应的适配互斥锁,并将所述第一线程的适配互斥锁插入所述预设数据库中;
判断模块,用于当所述预设业务程序的第二线程访问所述预设数据库时,判断所述第二线程的互斥锁是否位于所述互斥锁池中;
第二转换模块,用于在所述第二线程的互斥锁位于所述互斥锁池中时,将所述第二线程的互斥锁转换为所述互斥锁池对应的适配互斥锁;
处理模块,用于将所述第二线程的所述适配互斥锁与所述预设数据库中已插入的所述适配互斥锁进行比较,判定所述第二线程的所述适配互斥锁与所述预设数据库中的所述适配互斥锁互斥时,所述第二线程不能访问所述预设数据库。
与现有技术相比,本申请可以获得包括以下技术效果:
1)在第一线程和第二线程同时访问预设数据库时,只要所述第一线程的互斥锁和第二线程的互斥锁同时位于所述互斥锁池中,即使所述第一线程的互斥锁和第二线程的互斥锁不相同,也可以判断所述第一线程和第二线程不能同时访问所述预设数据库,如此实现避免不同操作的线程并发访问同一数据库。
2)将第一线程的互斥锁位于互斥锁池时可以将其转换为所述互斥锁池对应的适配互斥锁,并将第一线程的适配互斥锁插入预设数据库中;在第二线程访问所述预设数据库时,如果所述第二线程的互斥锁也位于所述互斥锁池中,也将其转化为所述互斥锁池对应的适配互斥锁。如此,由于第二线程的适配互斥锁与所述预设数据库中插入的适配互斥锁相同,就可以判断所述第二线程不能访问所述预设数据库。这样,即使第二线程的互斥锁与第一线程的互斥锁不相同,也可以实现避免不同操作的线程并发访问同一数据库。
实施例描述
下面以一实施例对本申请方法的实现作进一步说明。如图1所示,为本申请实施例的一种避免线程并发访问数据库的方法流程图,该方法包括:
S101:当预设业务程序的第一线程和第二线程同时访问预设数据库时,获取所述预设业务程序的互斥锁池。
本实施例中,所述预设业务程序可以是需要实现避免不同操作的线程并发访问同一数据库的任何业务程序。
所述第一线程和第二线程可以是不同操作的线程。
所述互斥锁池中存储有将预设业务程序的指定要素进行遍历组合得到的多种互斥锁。互斥锁池是在执行本步骤之前预先生成,具体生成过程参见图2,在图2对应的内容进行了详细描述。
参见图2,在本实施例的一优选实施例中,在步骤S101当预设业务程序的第一线程和第二线程同时访问预设数据库时,获取所述预设业务程序的互斥锁池之前,还包括如下步骤:
S105:获取预设业务程序的指定要素。
例如:预设业务程序的全部要素为:a,b,c,d。设置预设业务程序的指定要素是预设业务程序的全部要素,即此处预设业务程序的指定要素为:a,b,c,d。
S106:将指定要素进行遍历组合,每一种组合的要素设置一个互斥锁,得到多种互斥锁。
例如:预设业务程序的指定要素为:a,b,c,d,将指定要素进行遍历组合得到:a,b,c,d,(a,b),(a,c),(a,d),(b,c),(b,d),(c,d),(a,b,c),(a,b,d),(b,c,d),(a,b,c,d)。每一种组合的要素设置一个互斥锁,得到多种互斥锁为:互斥锁a,互斥锁b,互斥锁c,互斥锁d,互斥锁(a,b),互斥锁(a,c),互斥锁(a,d),互斥锁(b,c),互斥锁(b,d),互斥锁(c,d),互斥锁(a,b,c),互斥锁(a,b,d),互斥锁(b,c,d),互斥锁(a,b,c,d)。
S107:将多种互斥锁存储在互斥锁池中。
具体地,参见图3,将多种互斥锁存储在互斥锁池中得到互斥锁池。
通过本实施例,将预设业务程序的指定要素进行遍历组合,每一种组合的要素设置一个互斥锁,得到多种互斥锁,将多种互斥锁存储在互斥锁池中得到互斥锁池,可以将任何线程的要素作为指定要素,将预设业务程序的任何线程的互斥锁都存储在互斥锁池中,可以实现避免预设业务程序的任何线程并发访问同一数据库。
S102:判断所述第一线程的互斥锁和第二线程的互斥锁是否同时位于所述互斥锁池中。
判断所述第一线程的互斥锁和第二线程的互斥锁是否同时位于所述互斥锁池中。如果所述第一线程的互斥锁和第二线程的互斥锁同时位于所述互斥锁池中,则执行步骤S103。
S103:若是,则判定所述第一线程和第二线程不能同时访问所述预设数据库。
如果所述第一线程的互斥锁和第二线程的互斥锁同时位于所述互斥锁池中,则判定所述第一线程和第二线程不能同时访问所述预设数据库。
需要说明的是,当第二线程之后有第三线程、第四线程等访问预设数据库时,与第二线程的处理过程类似,第三线程、第四线程也不能访问预设数据库。
通过本实施例,在第一线程和第二线程同时访问预设数据库时,只要所述第一线程的互斥锁和第二线程的互斥锁同时位于所述互斥锁池中,即使所述第一线程的互斥锁和第二线程的互斥锁不相同,也可以判断所述第一线程和第二线程不能同时访问所述预设数据库,如此实现避免不同操作的线程并发访问同一数据库。
如图4所示,为本申请实施例的一种避免线程并发访问数据库的方法流程图,该方法包括:
S201:当预设业务程序的第一线程访问预设数据库时,获取所述预设业务程序的互斥锁池,以及所述互斥锁池对应的适配互斥锁。
本实施例与上述实施例不同之处在于,第一线程和第二线程并不是同时访问预设数据库的,而是第一线程先访问预设数据库,然后第二线程再访问预设数据库时,并且第一线程没有结束访问预设数据库,这样就会出现不同操作的线程并发访问预设数据库的情况。
所述当预设业务程序的第一线程访问预设数据库时,获取所述预设业务程序的互斥锁池与上述实施例中步骤S101相同,此处不再赘述。
所述适配互斥锁可以是指包括预设业务程序的指定要素的互斥锁,或包括预设业务程序的要素之外的其他要素的互斥锁。预设业务程序的指定要素可以是预设业务程序的全部要素、预设业务程序的部分要素等。参照上述实施例中步骤106所述的例子,适配互斥锁可以是包括预设业务程序的指定要素的互斥锁(如互斥锁(a,b,c,d)、互斥锁c、互斥锁(a,b)等),适配互斥锁还可以是包括预设业务程序的要素之外的其他要素的互斥锁(如互斥锁t)。
S202:若所述第一线程的互斥锁位于所述互斥锁池中,则将所述第一线程的互斥锁转换为所述互斥锁池对应的适配互斥锁,并将所述第一线程的适配互斥锁插入所述预设数据库中。
具体地,如果所述第一线程的互斥锁位于所述互斥锁池中,则获取预设业务程序的互斥锁池对应的适配互斥锁;将所述第一线程的互斥锁转换为所述互斥锁池对应的适配互斥锁;将所述第一线程的适配互斥锁插入所述预设数据库中。
S203:当所述预设业务程序的第二线程访问所述预设数据库时,判断所述第二线程的互斥锁是否位于所述互斥锁池中。
当所述预设业务程序的第二线程访问所述预设数据库时,由于第一线程还在访问所述预设数据库,所以需要判断第二线程的互斥锁和已插入所述预设数据库中适配互斥锁是否互斥。当然在判断之前,还需要判断所述第二线程的互斥锁是否位于所述互斥锁池中;如果所述第二线程的互斥锁不位于所述互斥锁池中,则显然所述第二线程的互斥锁与所述预设数据库中适配互斥锁不互斥,不影响第二线程的访问;但是,如果所述第二线程的互斥锁位于所述互斥锁池中,则执行步骤S204。
S204:若是,则将所述第二线程的互斥锁转换为所述互斥锁池对应的适配互斥锁,并将所述第二线程的所述适配互斥锁与所述预设数据库中已插入的所述适配互斥锁进行比较。
如果所述第二线程的互斥锁位于所述互斥锁池中,将所述第二线程的互斥锁转换为所述互斥锁池对应的适配互斥锁。进而将所述第二线程的所述适配互斥锁与所述预设数据库中已插入的所述适配互斥锁进行比较。
S205:若判定所述第二线程的所述适配互斥锁与所述预设数据库中的所述适配互斥锁互斥,则所述第二线程不能访问所述预设数据库。
如果判定所述第二线程的所述适配互斥锁与所述预设数据库中的所述适配互斥锁互斥,则所述第二线程不能访问所述预设数据库。
通过本实施例,将第一线程的互斥锁位于互斥锁池时可以将其转换为所述互斥锁池对应的适配互斥锁,并将第一线程的适配互斥锁插入预设数据库中;在第二线程访问所述预设数据库时,如果所述第二线程的互斥锁也位于所述互斥锁池中,也将其转化为所述互斥锁池对应的适配互斥锁。如此,由于第二线程的适配互斥锁与所述预设数据库中插入的适配互斥锁相同,就可以判断所述第二线程不能访问所述预设数据库。这样,即使第二线程的互斥锁与第一线程的互斥锁不相同,也可以实现避免不同操作的线程并发访问同一数据库。
与上述方法流程对应的,本申请的实施例还提供了一种数值输入装置。该装置可以通过软件实现,也可以通过硬件或者软硬件结合的方式实现。以软件实现为例,作为逻辑意义上的装置,是通过服务器的中央处理器(CentralProcess Unit,CPU)将对应的计算机程序指令读取到内存中运行形成的。
如图5所示,是本申请实施例的一种避免线程并发访问数据库的装置结构图,该装置包括:
第一获取模块301,用于当预设业务程序的第一线程和第二线程同时访问预设数据库时,获取所述预设业务程序的互斥锁池;其中,所述互斥锁池中存储有将所述预设业务程序的指定要素进行遍历组合得到的多种互斥锁;
判断模块302,用于判断所述第一线程的互斥锁和第二线程的互斥锁是否同时位于所述互斥锁池中;
处理模块303,用于在所述第一线程的互斥锁和第二线程的互斥锁同时位于所述互斥锁池中时,判定所述第一线程和第二线程不能同时访问所述预设数据库。
通过本实施例,在第一线程和第二线程同时访问预设数据库时,只要所述第一线程的互斥锁和第二线程的互斥锁同时位于所述互斥锁池中,即使所述第一线程的互斥锁和第二线程的互斥锁不相同,也可以判断所述第一线程和第二线程不能同时访问所述预设数据库,如此实现避免不同操作的线程并发访问同一数据库。
进一步地,参见图6所示,在所述第一获取模块301之前该装置还可以包括:
第二获取模块304,用于当预设业务程序的第一线程访问预设数据库时,获取预设业务程序的互斥锁池,以及互斥锁池对应的适配互斥锁之前获取预设业务程序的指定要素;
设置模块305,用于将指定要素进行遍历组合,每一种组合的要素设置一个互斥锁,得到多种互斥锁;
配置模块306,用于将多种互斥锁存储在互斥锁池中。
通过本实施例,将预设业务程序的指定要素进行遍历组合,每一种组合的要素设置一个互斥锁,得到多种互斥锁,将多种互斥锁存储在互斥锁池中得到互斥锁池,可以将任何线程的要素作为指定要素,将预设业务程序的任何线程的互斥锁都存储在互斥锁池中,可以实现避免预设业务程序的任何线程并发访问同一数据库。
如图7所示,是本申请实施例的一种避免线程并发访问数据库的装置结构图,该装置包括:
第一获取模块401,用于当预设业务程序的第一线程访问预设数据库时,获取所述预设业务程序的互斥锁池,以及所述互斥锁池对应的适配互斥锁;其中,所述互斥锁池中存储有将所述预设业务程序的指定要素进行遍历组合得到的多种互斥锁;
本实施例中,所述适配互斥锁包括所述预设业务程序的指定要素的互斥锁;或者,所述预设业务程序的要素之外的其他要素的互斥锁。
第一转换模块402,用于若所述第一线程的互斥锁位于所述互斥锁池中,则将所述第一线程的互斥锁转换为所述互斥锁池对应的适配互斥锁,并将所述第一线程的适配互斥锁插入所述预设数据库中;
判断模块403,用于当所述预设业务程序的第二线程访问所述预设数据库时,判断所述第二线程的互斥锁是否位于所述互斥锁池中;
第二转换模块404,用于在所述第二线程的互斥锁位于所述互斥锁池中时,将所述第二线程的互斥锁转换为所述互斥锁池对应的适配互斥锁;
处理模块405,用于将所述第二线程的所述适配互斥锁与所述预设数据库中已插入的所述适配互斥锁进行比较,判定所述第二线程的所述适配互斥锁与所述预设数据库中的所述适配互斥锁互斥时,所述第二线程不能访问所述预设数据库。
通过本实施例,将第一线程的互斥锁位于互斥锁池时可以将其转换为所述互斥锁池对应的适配互斥锁,并将第一线程的适配互斥锁插入预设数据库中;在第二线程访问所述预设数据库时,如果所述第二线程的互斥锁也位于所述互斥锁池中,也将其转化为所述互斥锁池对应的适配互斥锁。如此,由于第二线程的适配互斥锁与所述预设数据库中插入的适配互斥锁相同,就可以判断所述第二线程不能访问所述预设数据库。这样,即使第二线程的互斥锁与第一线程的互斥锁不相同,也可以实现避免不同操作的线程并发访问同一数据库。
进一步地,参见图8所示,在所述第一获取模块401之前该装置还可以包括:
第二获取模块404,用于当预设业务程序的第一线程访问预设数据库时,获取预设业务程序的互斥锁池,以及互斥锁池对应的适配互斥锁之前获取预设业务程序的指定要素;
设置模块405,用于将指定要素进行遍历组合,每一种组合的要素设置一个互斥锁,得到多种互斥锁;
配置模块406,用于将多种互斥锁存储在互斥锁池中。
通过本实施例,将预设业务程序的指定要素进行遍历组合,每一种组合的要素设置一个互斥锁,得到多种互斥锁,将多种互斥锁存储在互斥锁池中得到互斥锁池,可以将任何线程的要素作为指定要素,将预设业务程序的任何线程的互斥锁都存储在互斥锁池中,可以实现避免预设业务程序的任何线程并发访问同一数据库。
上述说明示出并描述了本申请的若干优选实施例,但如前所述,应当理解本申请并非局限于本文所披露的形式,不应看作是对其他实施例的排除,而可用于各种其他组合、修改和环境,并能够在本文所述发明构想范围内,通过上述教导或相关领域的技术或知识进行改动。而本领域人员所进行的改动和变化不脱离本申请的精神和范围,则都应在本申请所附权利要求的保护范围内。