共享资源访问方法和装置与流程

文档序号:12463714阅读:303来源:国知局
共享资源访问方法和装置与流程

本发明涉及计算机技术领域,特别是涉及一种共享资源访问方法和装置。



背景技术:

在软件系统中,通常有些共享资源,例如:单据编码的最大号获取、获取当前预算额度、获取当前账户余额等。这些共享资源有一个特性,必须排队执行,上一次调用完成,下一次调用必须依赖上一次调用完成的结果进行处理,以保证数据的及时和正确性。如果把这些共享资源放在一个事务环境中,一次共享资源调用消耗的时间就取决于这个事务完成所需的时间,如果占用共享资源的事务耗时很长,就会造成大量锁等待,因此会占用大量的系统资源,甚至引起服务器宕机。

传统技术中,一般是通过减少占用共享资源的事务的耗时,来减少锁等待。然而,事务本身是比较难优化的,其本身就是需要一定的时间才能处理完成。因此,传统技术不能有效减少锁等待,减少系统资源的占用。



技术实现要素:

基于此,有必要针对上述技术问题,提供了一种能减少锁等待,从而减少系统资源占用的共享资源访问方法和装置。

一种共享资源访问方法,所述方法包括:

获取业务处理请求,开始业务处理;

当所述业务处理使用共享资源时,创建独立的内部事务调用所述共享资源;

执行所述内部事务,并在所述内部事务完成时释放共享资源的资源锁;

执行与所述内部事务对应的外部事务,所述外部事务使用所述内部事务的处理结果。

在其中一个实施例中,所述方法还包括:

若所述外部事务执行过程正常,则进行提交操作,修改数据库对应的日志状态为提交;若所述外部事务执行过程出现异常,则进行回滚操作,修改数据库对应的日志状态为回滚。

在其中一个实施例中,所述进行提交操作,包括:

调用在外部事务中注册的提交事件,在所述提交时间中提交外部事务的处理结果。

在其中一个实施例中,所述进行回滚操作,包括:

调用在外部事务中注册的回滚事件,在所述回滚事件中释放所述内部事务的处理结果,将所述内部事务的处理结果返回到所述数据库中。

在其中一个实施例中,所述方法还包括:

当执行与所述内部事务对应的外部事务时,修改数据库对应的日志状态为进行中;定时检测数据库日志状态,若所述数据库日志状态为进行中的时间超过预设的时间阈值,则对外部事务的处理结果进行补偿。

一种共享资源访问装置,所述装置包括:

请求获取模块,用于获取业务处理请求,开始业务处理;

事务创建模块,用于当所述业务处理使用共享资源时,创建独立的内部事务调用所述共享资源;

第一事务执行模块,用于执行所述内部事务,并在所述内部事务完成时释放共享资源的资源锁;

第二事务执行模块,用于执行与所述内部事务对应的外部事务,所述外部事务使用所述内部事务的处理结果。

在其中一个实施例中,所述装置还包括:

提交模块,用于若所述外部事务执行过程正常,则进行提交操作;

日志处理模块,用于修改数据库对应的日志状态为提交;

回滚模块,用于若所述外部事务执行过程出现异常,则进行回滚操作;

所述日志处理模块还用于修改数据库对应的日志状态为回滚。

在其中一个实施例中,所述提交模块还用于调用在外部事务中注册的提交事件,在所述提交时间中提交外部事务的处理结果。

在其中一个实施例中,所述回滚模块还用于调用在外部事务中注册的回滚事件,在所述回滚事件中释放所述内部事务的处理结果,将所述内部事务的处理结果返回所述数据库中。

在其中一个实施例中,所述日志处理模块还用于当执行与所述内部事务对应的外部事务时,修改数据库对应的日志状态为进行中;

所述装置还包括:补偿模块,用于定时检测数据库日志状态,若所述数据库日志状态为进行中的时间超过预设的时间阈值,则对外部事务的处理结果进行补偿。

上述共享资源访问方法和装置,通过创建内部事务对共享资源进行保护,执行所述内部事务,并在所述内部事务完成时释放共享资源的资源锁,外部事务使用内部事务的处理结果,不再长时间调用共享资源,使得共享资源可以及时被使用,减少锁等待,从而减少系统资源的占用。

附图说明

图1为一个实施例中共享资源访问方法的流程图;

图2为另一个实施例中共享资源访问方法的流程图;

图3为一个实施例中共享资源访问方法的原理图;

图4为另一个实施例中共享资源访问方法的原理图;

图5为一个实施例中共享资源访问方法的结构框图;

图6为另一个实施例中共享资源访问方法的结构框图。

具体实施方式

为了使本发明的目的、技术方案及优点更加清楚明白,以下结合附图及实施例,对本发明进行进一步详细说明。应当理解,此处所描述的具体实施例仅仅用以解释本发明,并不用于限定本发明。

如图1所示,在一个实施例中,提供了一种共享资源访问方法,包括:

步骤102,获取业务处理请求,开始业务处理。

本实施例中,业务处理是一个十分广泛的概念,包含一切可以通过软件系统进行处理的事项,因此业务处理并不局限于某种特定的处理。例如业务处理可以是单据提交或者转账汇款等。

步骤104,当业务处理使用共享资源时,创建独立的内部事务调用共享资源。

本实施例中,共享资源可以看作是一个业务处理动作,例如单据编码做大号获取、获取当前预算额度、获取当前账户余额等。共享资源在数据库中有对应的共享资源数据。这些共享资源有一个共同的特性,必须排队执行,上一次调用完成,下一次调用必须依赖上一次调用完成的结果进行处理,以防止出现数据错误。例如获取单据编码,由于单据的处理需要按照固定的顺序进行,所以单据获取单据编码应当排队执行,如果顺序在后的单据获得了顺序在前单据的编码或者前一张单据提交失败,后一张单据没有获得前一张单据的编码,都会引起数据出错。

事务指的是访问并可能更新数据库中的各种数据项的一个程序执行单元。具体的,事务一般以begin transaction(开始事务)为起始点,以commit(提交)或rollback(回滚)结束。进一步的,创建独立的内部事务调用共享资源,可以认为是内部事务对共享资源的保护,内部事务通过资源锁独占的锁定共享资源,以防止并发执行可能造成的共享资源数据不一致的问题。

步骤106,执行内部事务,并在内部事务完成时释放共享资源的资源锁。

在本实施例中,执行内部事务,指的是内部事务访问共享资源,执行共享资源的业务处理动作,如果发生改变共享资源数据的情况,则更新数据库中的数据项,以防止出现数据错误。资源锁,是一种排它锁,在内部事务调用共享资源时加上资源锁,使得其他事务不能对共享资源进行读取和修改。具体的,内部事务在调用共享资源时,通过资源锁排他性的占有共享资源,在内部事务完成时,释放共享资源的资源锁,使得下一个事务可以调用共享资源。例如在获取单据编码中,顺序在前的单据通过调用共享资源,并排他性的占用共享资源,从而获得相应的编码,在该单据占用共享资源期间,其他单据均不能调用共享资源,在该单据获得编码后,释放共享资源的资源锁,使得下一个单据可以通过共享资源获取相应的单据编码。

步骤108,执行与内部事务对应的外部事务,外部事务使用内部事务的处理结果。

本实施例中,内部事务存在对应的外部事务,外部事务通过使用内部事务的处理结果,得到外部事务的处理结果。其中,外部事务与内部事务是相对的概念,外部事务是在业务处理中内部事务后续的待执行事务,同样的,外部事务可以存在后续的待执行事务,通过调用外部事务的处理结果,在执行后获得更进一步的处理结果。

本实施例中,通过创建内部事务对共享资源进行保护,执行内部事务,并在内部事务完成时释放共享资源的资源锁,外部事务使用内部事务的处理结果,不再长时间调用共享资源,使得共享资源可以及时被使用,减少锁等待,从而减少了系统资源的占用。

在一个实施例中,该方法还包括:若外部事务执行过程正常,则进行提交操作,修改数据库对应的日志状态为提交;若外部事务执行过程出现异常,则进行回滚操作,修改数据库对应的日志状态为回滚。

在一个实施例中,进行提交操作,包括:调用在外部事务中注册的提交事件,在提交事件中提交外部事务的处理结果。

在一个实施例中,进行回滚操作,包括:调用在外部事务中注册的回滚事件,在回滚事件中释放内部事务的处理结果,将内部事务的处理结果返回到数据库中。

在一个实施例中,该方法还包括:当执行与内部事务对应的外部事务时,修改数据库对应的日志状态为进行中;定时检测数据库日志状态,若数据库日志状态为进行中的时间超过预设的时间阈值,则对外部事务的处理结果进行补偿。

如图2所示,在一个实施例中,提供了一种共享资源访问方法,包括:

步骤202,执行与内部事务对应的外部事务。

在本实施例中,外部事务与内部事务是相对的概念,外部事务是在业务处理中内部事务后续的待执行事务,同样的,外部事务可以存在后续的待执行事务,通过调用外部事务的处理结果,在执行后获得更进一步的处理结果。例如在转账汇款中,内部事务调用共享资源获取当前账户余额;执行内部事务,当内部事务完成时释放共享资源的资源锁,让之后的事务可以掉用共享资源;外部事务获取内部事务的处理结果,在当前账户余额中扣除需要汇出的金额,并修改数据库数据;此时,外部事务存在后续的待执行事务,通过获取外部事务的处理结果,得到汇出的金额,在收款人账户中添加该金额,并修改相应的数据库数据。

步骤204,修改数据库对应的日志状态为进行中。

在本实施例中,数据库对应的日志是事务日志,是一个与数据库分开的文件,它存储对数据库进行的所有更改,并全部记录插入、更新、删除、提交、回滚和数据库模式变化,是备份和恢复数据库的重要组件。具体的,在外部事务开始执行时,修改数据库对应的日志状态为进行中,在外部事务执行状态发生变化时,再对数据库对应的日志状态进行相应的修改。例如,在单据提交中,在终端开始提交单据直到出现结果前,数据库对应的日志状态应当为进行中。

步骤206,定时检测数据库日志状态,若数据库日志状态为进行中的时间超过预设的时间阈值,则对外部事务的处理结果进行补偿。

在本实施例中,为了保证软件系统的正常运行,终端有预设的时间阈值,如果数据库日志状态一直处于进行中,并且超过了时间阈值,则可以认为业务处理的过程中出现了异常,从而对处理结果进行补偿。处理结果包含事务执行结果、数据库对应的日志状态和存储中的日志处理情况。需要说明的是,补偿的对象是所有出现异常的情况,通过对数据库日志状态进行检测而得到的异常情况只是其中的一种,这里的补偿可以补偿更为广泛的对象。如图3所示,业务处理通过独立的内部事务调用的共享资源进行,在外部事务环境中,通过外部事务调用内部事务的处理结果进行业务处理,当业务处理出现异常时,在外部事务环境下捕获异常,根据异常的具体情况采取相应的补偿,如果发生共享资源数据出现错误的情况,则恢复共享资源数据。例如,在单据提交中,如果前一个单据提交过程中出现错误,则在外部事务环境中捕获单据提交出错的异常,将这个单据的单据编码返回到数据库中,用于恢复共享资源数据。

步骤208,判断外部事务执行过程是否正常,若是,则进入步骤210,若否,则进入步骤214。

本实施例中,执行外部事务,若外部事务执行过程正常,则进入进行提交操作的步骤,若外部事务执行过程异常,则进入进行回滚操作的步骤。

步骤210,进行提交操作,修改数据库对应的日志状态为提交。

本实施例中,进行提交操作,修改数据库对应的日志状态为提交,若修改数据库对应的日志状态失败,则记录在运行环境的存储中。在定时任务检测到运行环境的存储中的日记处理状态异常时,对该日志处理异常进行补偿。具体的,提交操作代表事务正常的完成,可以获得业务处理希望达到的结果。例如在转账汇款中,根据前一事务的执行结果得到汇出的金额后,如果在收款人账户中成功添加该金额,并成功修改数据库数据,则可以认为事务正常完成,获得了业务处理希望达到的结果。

步骤212,调用在外部事务中注册的提交事件,在提交事件中提交外部事务的处理结果。

本实施例中,注册的提交事件是利用J2ee(Java 2Platform Enterprise Edi-tion,Java2平台企业版)事件注册机制,构造java类实现javax.transaction.Syn-chronization(接口名称)接口,注册到J2ee系统的当前事务对象中。通过在提交事件中提交外部事务的处理结果完成外部事务。进一步的,通过事件注册对每一个业务处理都进行注册,可以防止出现遗漏处理的情况发生。

步骤214,进行回滚操作,修改数据库对应的日志状态为回滚。

本实施例中,进行回滚操作,修改数据库对应的日志状态为回滚,若修改数据库对应的日志状态失败,则记录在运行环境的存储中。在定时任务检测到运行环境的存储中的日志处理状态异常时,对该日志处理异常进行补偿。具体的,回滚操作代表事务执行出现错误,没有获得业务处理希望达到的结果。例如,在转账汇款中,根据前一事务的执行结果获取汇款人汇出金额,如果在收款人账户中添加该金额失败,则判定事务执行出现错误,进行回滚操作,将该金额返回到汇款人账户的数据库中,防止数据出现错误。

步骤216,调用在外部事务中注册的回滚事件,在回滚事件中释放内部事务的处理结果,将内部事务的处理结果返回到数据库中。

本实施例中,如图4所示,注册的提交事件和回滚事件是利用J2ee事件注册机制预设的。对于注册的提交事件而言,具体的,在外部事务执行过程正常的情况下,通过事件注册对每一个业务处理都进行注册,可以防止出现遗漏处理的情况发生,保证了业务处理结果的一致性,保证了数据最终一致性。对于注册的回滚事件而言,具体的,由于外部事务执行过程出现异常,导致之前获取的内部事务的处理结果处于闲置状态,这样会造成数据库中的共享资源数据出现错误,从而影响到整个业务处理结果的正确性。进一步的,事务具有原子性,即事务执行出现异常必然会引起回滚,发生事务回滚时,将内部事务的处理结果返回到数据库中,恢复共享资源数据,防止数据库数据出现错误。例如,在单据提交中,通过J2ee事件注册机制对每一个单据提交和回滚进行注册,在正常情况下调用注册的提交事件进行提交单据处理,如果事务执行过程中出现异常,则调用注册的回滚事件进行回滚操作,释放在前一事务中获取的单据编码,将该单据编码返还到数据库中恢复共享资源数据。如图5所示,在一个实施例中,提供了一种共享资源访问装置,包括:

请求获取模块502,用于获取业务处理请求,开始业务处理。

事务创建模块504,用于当业务处理使用共享资源时,创建独立的内部事务调用共享资源。

第一事务执行模块506,用于执行内部事务,并在内部事务完成时释放共享资源的资源锁。

第二事务执行模块508,用于执行与内部事务对应的外部事务,外部事务使用内部事务的处理结果。

如图6所示,在一个实施例中,共享资源访问装置还包括:

提交模块410,用于若外部事务执行过程正常,则进行提交操作。

回滚模块412,用于若外部事务执行过程异常,则进行回滚操作。

日志处理模块414,用于修改数据库对应的日志状态为提交;还用于修改数据库对应的日志状态为回滚。

在一个实施例中,提交模块510还用于调用在外部事件中注册的提交事件,在提交事件中提交外部事务的处理结果。

在一个实施例中,回滚模块512还用于调用在外部事务中注册的回滚事件,在回滚事件中释放内部事务的处理结果,将内部事务的处理结果返回到数据库中。

在一个实施例中,日志处理模块514还用于当执行与内部事务对应的外部事务时,修改数据库对应的日志状态为进行中。

在一个实施例中,共享资源访问装置还包括:补偿模块516,用于定时检测数据库日志状态,若数据库日志状态为进行中的时间超过预设的时间阈值,则对外部事务的处理结果进行补偿。

以上所述实施例的各技术特征可以进行任意的组合,为使描述简洁,未对上述实施例中的各个技术特征所有可能的组合都进行描述,然而,只要这些技术特征的组合不存在矛盾,都应当认为是本说明书记载的范围。

以上所述实施例仅表达了本发明的几种实施方式,其描述较为具体和详细,但并不能因此而理解为对发明专利范围的限制。应当指出的是,对于本领域的普通技术人员来说,在不脱离本发明构思的前提下,还可以做出若干变形和改进,这些都属于本发明的保护范围。因此,本发明专利的保护范围应以所附权利要求为准。

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