实现内存数据和数据库数据事务一致性的处理方法

文档序号:6557639阅读:519来源:国知局
专利名称:实现内存数据和数据库数据事务一致性的处理方法
技术领域
本发明涉及一种内存数据事务处理的方法,尤其是发生应用程序不可控制的异常情况时,仍能自动保持内存数据的事务完整性的方法。
背景技术
对于大型且实时性要求较高的数据库应用系统,在数据的处理过程中,利用共享内存来缓存数据,以加速业务处理速度。由于内存相比硬盘等外存在存取速度等方面的巨大优势,采用内存缓存技术会极大提高业务处理速度。这种处理方法要求在数据库事务的处理过程中,内存中的数据与数据库中数据要保持一致性。
目前现有的实现内存数据与数据库数据事务一致性的处理方法如下内存与数据库均开始事务;应用程序访问内存数据,更新内存中的数据,并在内存中记录数据变更日志;当对内存中的数据完成业务处理后,利用内存数据更新数据库数据;当数据库数据更新完成后,提交数据库事务;然后清理内存变更日志,并提交内存数据。
在上述过程中,应用程序检测到处理发生错误时,首先进行数据库事务的回退,再利用内存变更日志回退内存数据,保证事务的完整性。
现有技术的缺点在现有技术中,事务完全由应用程序控制,在发生应用可控的异常时,事务可以得到较好的保证,但在发生应用无法控制的异常时,如进程被强行终止等,由于应用没有机会进行异常处理,导致内存与数据库数据的不同步,且应用程序自身不了解数据库事务的完成情况,难以对异常自动处理,一般需人工干预恢复内存与数据库数据的同步。如果应用是多层系统的中间层服务,由于事务通常由客户端控制,无法使内存与数据库发生不同步时自动恢复内存数据。

发明内容
本发明的目的是针对上述现有技术中实现内存数据与数据库数据事务一致性的处理方法存在的不足,提供一种实现内存数据与数据库数据事务一致性的处理方法,通过在事务处理过程中对内存和数据库的事务处理对象进行加锁,并记录事务处理的流水号,使得在发生应用程序不可控的异常时,可以根据数据库事务的完成情况,自动的恢复内存中的数据,保持内存数据与数据库数据的一致性。
为了实现上述发明目的,本发明提供了一种实现内存数据与数据库数据事务一致性的处理方法,包括如下步骤步骤1、当内存和数据库在开始事务时,对内存和数据库的事务处理对象加锁;步骤2、生成本次事务的唯一事务流水号,将该流水号和事务类型记录在内存和数据库的事务日志中;步骤3、对内存中的数据进行事务处理,并记录内存变更日志;步骤4、当完成对内存中的数据进行事务处理后,利用内存数据更新数据库数据;步骤5、当数据库数据更新完成后,在数据库的事务日志中记录本次数据库事务处理成功,并解除数据库事务处理对象的锁;步骤6、解除内存事务处理对象的锁。
通过本发明提供的方法,不仅可以使内存数据和数据库数据保持同步,简化利用内存加快业务处理速度的应用程序的编程复杂度,还可以在异常发生时由应用程序自动恢复内存数据,尤其是在发生应用程序不可控的异常时,保持内存数据与数据库数据的一致性。
下面通过附图和实施例,对本发明的技术方案做进一步的详细描述。


图1为本发明的实现内存数据与数据库数据事务一致性的处理方法的具体实施例的流程图。
具体实施例方式
内存数据来源于数据库表,为了便于内存数据的访问和控制,按数据类型分为键值表和数据表。键值表存放业务对象的关键信息,如银行系统的储蓄账号、电信运营系统的用户号等。为加快键值表访问速度,可以将键值表组织成平衡二叉树、哈希表、键树等结构。数据表存放业务对象对应的各类数据,通过键值表可快速访问相关数据。
键值表如下所示

数据表结构依据具体存储数据而定,可以组织成单向或双向链表。
参见图1,其为本发明的实现内存数据与数据库数据事务一致性的处理方法的具体实施例的流程图,包括如下步骤
步骤101、当内存和数据库在开始事务时,对内存和数据库的事务处理对象加锁;其中事务处理对象为数据的关键信息,例如如银行的储蓄帐号和电信运营商的交费帐号等,并且事务锁是独占性的。
步骤102、生成本次事务的唯一事务流水号,将该流水号和事务类型记录在内存和数据库的事务日志中;步骤103、对内存中的数据进行事务处理,并记录内存变更日志;步骤104、当完成对内存中的数据进行事务处理后,利用内存数据更新数据库数据;步骤105、当数据库数据更新完成后,在数据库的事务日志中记录本次数据库事务处理成功,并解除数据库事务处理对象的锁;步骤106、解除内存事务处理对象的锁。在解除内存事务处理对象的锁后还可以包括清理内存变更日志的操作。
如果在上述的事务处理的过程中,在应用程序可控的范围内发生异常,如更新数据库失败等,则内存应用根据内存数据变更日志恢复内存中的数据,并利用数据库事务回滚机制恢复数据库数据。
如果在应用程序未知或不可控范围内发生异常,如进程被强行终止等,当该事务处理对象再次接受业务处理而进行加锁时,如果对数据库的事务处理对象加锁失败,表示事务处理对象正在被其他事务处理,则等待一定时间后重试加锁或报加锁失败返回。重试加锁成功则继续进行事务处理。
如果内存的事务处理对象加锁失败,则利用内存中记录的上次事务类型和事务流水号,查询数据库业务日志上次事务处理的日志,判断上次数据库的事务处理是否成功,如果上次数据库的事务处理成功,则表示上次内存数据处理成功完成,对内存事务处理对象重新加锁,然后继续进行事务处理;如果上次数据库事务处理失败,则表示内存中数据有与数据库中的数据不一致的可能性,利用数据库中的数据恢复内存中的数据,恢复后对所述内存的事务处理对象重新加锁,继续进行事务处理。
本发明具有如下有益效果
减少了现有技术中必须的内存提交步骤,保证了内存和数据库数据的一致性。并能在异常发生时,由内存应用自动重新同步内存和数据库的数据,尤其是在发生应用程序不可控的异常时,保持内存数据与数据库数据的一致性。而其他利用内存应用的应用程序无需对内存事务进行任何附加处理,从而实现内存事务的透明管理,扩展了内存缓存技术的适用领域。
最后所应说明的是,以上实施例仅用以说明本发明的技术方案而非限制,尽管参照较佳实施例对本发明进行了详细说明,本领域的普通技术人员应当理解,可以对本发明的技术方案进行修改或者等同替换,而不脱离本发明技术方案的精神和范围。
权利要求
1.一种实现内存数据和数据库数据事务一致性的处理方法,其特征在于包括如下步骤步骤1、当内存和数据库在开始事务时,对内存和数据库的事务处理对象加锁;步骤2、生成本次事务的唯一事务流水号,将该流水号和事务类型记录在内存和数据库的事务日志中;步骤3、对内存中的数据进行事务处理,并记录内存变更日志;步骤4、当完成对内存中的数据进行事务处理后,利用内存数据更新数据库数据;步骤5、当数据库数据更新完成后,在数据库的事务日志中记录本次数据库事务处理成功,并解除数据库事务处理对象的锁;步骤6、解除内存事务处理对象的锁。
2.根据权利要求1所述的方法,其特征在于在所述步骤6中,在解除内存事务处理对象的锁后还包括清理内存变更日志的操作。
3.根据权利要求1所述的方法,其特征在于如果在事务处理的过程中,在应用程序可控的范围内发生异常,则根据内存数据变更日志恢复内存中的数据,并利用数据库事务回滚机制恢复数据库数据。
4.根据权利要求1所述的方法,其特征在于如果对数据库的事务处理对象加锁失败,则等待后重试加锁或报加锁失败返回。
5.根据权利要求1所述的方法,其特征在于在所述步骤1中,如果内存的事务处理对象加锁失败,则利用内存中记录的上次事务类型和事务流水号,查询数据库业务日志上次事务处理的日志,判断上次数据库的事务处理是否成功,如果上次数据库的事务处理成功,则对所述内存的事务处理对象重新加锁,然后继续进行事务处理;如果上次数据库事务处理失败,则利用数据库中的数据恢复内存中的数据,恢复后对所述内存的事务处理对象重新加锁,继续进行事务处理。
全文摘要
本发明涉及一种实现内存数据与数据库数据事务一致性的处理方法,包括1.当内存和数据库在开始事务时,对内存和数据库的事务处理对象加锁;2.生成本次事务的唯一事务流水号,将该流水号和事务类型记录在内存和数据库的事务日志中;3.对内存中的数据进行事务处理,并记录内存变更日志;4.利用内存数据更新数据库数据;5.在数据库的事务日志中记录本次数据库事务处理成功,并解除数据库事务处理对象的锁;6.解除内存事务处理对象的锁。通过本发明提供的方法,简化了利用内存加快业务处理速度的应用程序的复杂度,并在异常发生时由应用程序自动恢复内存数据,尤其是在发生应用程序不可控的异常时,保持内存数据与数据库数据的一致性。
文档编号G06F9/46GK1858745SQ20061006638
公开日2006年11月8日 申请日期2006年4月5日 优先权日2006年4月5日
发明者尹春雷, 迟峻峰 申请人:华为技术有限公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1