一种基于SpringBoot+JPA的数据库乐观锁实现方法及系统与流程

文档序号:19745052发布日期:2020-01-21 18:13阅读:1949来源:国知局
本发明涉及数据库领域,具体地说是一种基于springboot+jpa的数据库乐观锁实现方法及系统。
背景技术
::springboot是java平台上的一种开源应用框架,提供具有控制反转特性的容器。该框架使用了特定的方式来进行配置,从而使开发人员不再需要定义样板化的配置。jpa是javapersistenceapi的简称,中文名java持久层api,是jdk5.0注解或xml描述对象-关系表的映射关系,并将运行期的实体对象持久化到数据库中。并发是指多个执行单元同时、并行被执行,而并发的执行单位对于共享资源(硬件资源和软件上的全局变量、静态变量等)的访问很容易导致竞态(raceconditions)。并发执行操作会造成数据库中数据重复等问题,解决办法是加锁。乐观锁(optimisticlocking)相对悲观锁而言,乐观锁机制采取了更加宽松的加锁机制。悲观锁大多数情况下依靠数据库的锁机制实现,以保证操作最大程度的独占性。但随之而来的就是数据库性能的大量开销,特别是对长事务而言,这样的开销往往无法承受。而乐观锁机制在一定程度上解决了这个问题。乐观锁,大多是基于数据版本(version)记录机制实现。何谓数据版本?即为数据增加一个版本标识,在基于数据库表的版本解决方案中,一般是通过为数据库表增加一个“version”字段来实现。读取出数据时,将此版本号一同读出,之后更新时,对此版本号加一。此时,将提交数据的版本数据与数据库表对应记录的当前版本信息进行比对,如果提交的数据版本号大于数据库表当前版本号,则予以更新,否则认为是过期数据。故如何利用乐观锁避免并发情况下向数据库中定时插入数据过程中造成数据重复是目前现有技术存在的技术问题。专利号为cn108710541a的专利文献公开了一种定时任务的执行方法及装置,包括,当定时任务到达执行时间时,根据所述定时任务的编号查询所述定时任务的注册信息,判断所述定时任务的注册信息是否处于锁定状态,若否,则更新并锁定所述注册信息,以使其对其他节点处于不可编辑状态,并执行所述定时任务。所述定时任务的执行方法及装置,在定时任务达到执行时间时,节点首先查询所述定时任务的注册信息是否被锁定,在锁定时说明其他节点已经开始执行所述定时任务,不再重复执行所述定时任务;在没有锁定时则锁定所述注册信息并执行所述定时任务,使得其他节点不能够更新注册信息并重复执行所述定时任务,在避免定时任务重复执行的同时,保证了定时任务执行的高可用性。该技术方案的检索结果是对更新注册信息的定时任务的执行处理,但是不能避免并发情况下向数据库中定时插入数据过程中造成数据重复。专利号为cn109446214a的专利文献公开了一种大数据背景下基于乐观锁机制实现主数据版本管理的系统,包括乐观锁初始化模块;版本比对执行模块根据乐观锁机制在执行主数据更新操作时对主数据版本进行比对;冲突处理策略池用于将比对结果匹配相应的冲突处理策略;冲突处理模块用于将处理策略针对产生的主数据版本冲突按照匹配策略进行处理。该技术方案解决了大数据背景下主数据在多节点部署或者多线程执行等高并发环境下更新冲突的问题,从而减轻了主数据版本维护的工作量,实现了主数据版本精细化管理,提高了主数据更新的并发性,为企业及政府部门主数据实施及应用奠定了良好的基础。但是不能避免并发情况下向数据库中定时插入数据过程中造成数据重复。技术实现要素:本发明的技术任务是提供一种基于springboot+jpa的数据库乐观锁实现方法及系统,来解决如何利用乐观锁避免并发情况下向数据库中定时插入数据过程中造成数据重复的问题。本发明的技术任务是按以下方式实现的,一种基于springboot+jpa的数据库乐观锁实现方法,该方法步骤如下:s1、创建lock_table表:在数据库中新建一张lock_table表,lock_table用于存放锁的数据信息;s2、操作加锁:将并发事务操作加锁,在数据库中的lock_table表中增加该锁的数据信息;具体如下:s201、获取锁:查询lock_table表获取锁的信息,确保对应的进程获取该锁;s202、执行事务:对应进程进行继续执行,完成对数据库的事务操作;s203、释放锁:事务执行结束后,对应进程更新对应锁的版本号为当前日期,状态更新为未锁定,操作结束。作为优选,所述步骤s1中锁的数据信息包括锁名(lock_name)、版本号(version)及状态(lock_state)。作为优选,所述步骤s201中获取锁的步骤如下:(1)、查询lock_table中锁的信息,并判断该锁的版本号与当前版本号的大小关系:若锁a的版本号小于当前日期且状态为未锁定,则执行步骤(2);(2)、执行update语句更新该锁的状态为锁定,执行成功后返回值为更新的数据条数;(3)、判断对应进程更新的数据条数是否大于0:若对应进程更新的数据条数大于0,则说明对应进程获取了该锁;(4)、对应进程继续执行下一步,未获取到锁的进程终止执行。更优地,所述步骤(2)中update语句增加@transactional、@modifying注解。一种基于springboot+jpa的数据库乐观锁系统,该系统包括,lock_table表创建模块,用于在数据库中新建一张lock_table表,lock_table用于存放锁的数据信息;加锁操作模块,用于将并发事务操作加锁,在数据库中的lock_table表中增加该锁的数据信息;其中,加锁操作模块包括,锁获取模块,用于查询lock_table表获取锁的信息,确保对应的进程获取该锁;事务执行模块,用于对应进程进行继续执行,完成对数据库的事务操作;锁释放模块,用于在事务执行结束后,对应进程更新对应锁的版本号为当前日期,状态更新为未锁定,操作结束。作为优选,所述锁的数据信息包括锁名(lock_name)、版本号(version)及状态(lock_state)。作为优选,所述锁获取模块的工作过程:(1)、查询lock_table中锁的信息,并判断该锁的版本号与当前版本号的大小关系:若锁a的版本号小于当前日期且状态为未锁定,则执行步骤s302;(2)、执行update语句更新该锁的状态为锁定,执行成功后返回值为更新的数据条数;(3)、判断对应进程更新的数据条数是否大于0:①、若对应进程更新的数据条数大于0,则说明对应进程获取了该锁;(4)、对应进程继续执行下一步,未获取到锁的进程终止执行。更优地,所述update语句增加@transactional、@modifying注解。本发明的基于springboot+jpa的数据库乐观锁实现方法及系统具有以下优点:(一)、本发明实现了对并发事务的乐观锁处理,避免了数据重复等问题,通过数据库乐观锁解决并发问题;(二)、本发明是数据库乐观锁的一种实现方式,将加锁放在执行并发操作的前一步,避免了数据重复,降低了数据库报错的可能性;(三)、本发明能够满足对各种并发事务的处理,使用范围广,具有很好的推广使用价值。附图说明下面结合附图对本发明进一步说明。附图1为基于springboot+jpa的数据库乐观锁实现方法的流程框图;附图2为基于springboot+jpa的数据库乐观锁系统的结构框图。具体实施方式参照说明书附图和具体实施例对本发明的一种基于springboot+jpa的数据库乐观锁实现方法及系统作以下详细地说明。实施例1:如附图1所示,本发明的基于springboot+jpa的数据库乐观锁实现方法,该方法步骤如下:s1、创建lock_table表:在数据库中新建一张lock_table表,lock_table用于存放锁的数据信息;锁的数据信息包括锁名(lock_name)、版本号(version)及状态(lock_state)。lock_table表结构设计如下:lock_nameversionlock_state锁名版本号状态s2、操作加锁:将并发事务操作加锁,在数据库中的lock_table表中增加该锁的数据信息;具体如下:s201、获取锁:查询lock_table表获取锁的信息,确保对应的进程获取该锁;步骤如下:(1)、查询lock_table中锁的信息,并判断该锁的版本号与当前版本号的大小关系:若锁a的版本号小于当前日期且状态为未锁定,则执行步骤(2);(2)、执行update语句更新该锁的状态为锁定,update语句增加@transactional、@modifying注解,执行成功后返回值为更新的数据条数;(3)、判断对应进程更新的数据条数是否大于0:若对应进程更新的数据条数大于0,则说明对应进程获取了该锁;(4)、对应进程继续执行下一步,未获取到锁的进程终止执行。s202、执行事务:对应进程进行继续执行,完成对数据库的事务操作;s203、释放锁:事务执行结束后,对应进程更新对应锁的版本号为当前日期,状态更新为未锁定,操作结束。实施例2:如附图2所示,本发明的基于springboot+jpa的数据库乐观锁系统,该系统包括,lock_table表创建模块,用于在数据库中新建一张lock_table表,lock_table用于存放锁的数据信息;锁的数据信息包括锁名(lock_name)、版本号(version)及状态(lock_state)。加锁操作模块,用于将并发事务操作加锁,在数据库中的lock_table表中增加该锁的数据信息;其中,加锁操作模块包括,锁获取模块,用于查询lock_table表获取锁的信息,确保对应的进程获取该锁;事务执行模块,用于对应进程进行继续执行,完成对数据库的事务操作;锁释放模块,用于在事务执行结束后,对应进程更新对应锁的版本号为当前日期,状态更新为未锁定,操作结束。其中,锁获取模块的工作过程:(1)、查询lock_table中锁的信息,并判断该锁的版本号与当前版本号的大小关系:若锁a的版本号小于当前日期且状态为未锁定,则执行步骤s302;(2)、执行update语句更新该锁的状态为锁定,update语句增加@transactional、@modifying注解,执行成功后返回值为更新的数据条数;(3)、判断对应进程更新的数据条数是否大于0:①、若对应进程更新的数据条数大于0,则说明对应进程获取了该锁;(4)、对应进程继续执行下一步,未获取到锁的进程终止执行。实施例3:以将并发事务操作加锁a为例:在数据库的lock_table表中增加锁a的数据。并发事务加锁执行步骤如下:1)、获取锁:查询lock_table中锁a的信息,若锁a的版本号小于当前日期且状态为为“未锁定”,则执行update语句更新锁a的状态为“锁定”,update语句增加@transactional、@modifying注解,执行成功后返回值为更新的数据条数。若进程a更新的数据条数大于0,则说明进程a获取了锁。进程a继续执行下一步,其他未获取到锁的进程终止执行。2)、执行事务:进程a继续执行,完成对数据库的事务操作。3)、释放锁:事务执行结束后,进程a更新锁a的版本号为当前日期,状态更新为“未锁定”,操作结束。最后应说明的是:以上各实施例仅用以说明本发明的技术方案,而非对其限制;尽管参照前述各实施例对本发明进行了详细的说明,本领域的普通技术人员应当理解:其依然可以对前述各实施例所记载的技术方案进行修改,或者对其中部分或者全部技术特征进行等同替换;而这些修改或者替换,并不使相应技术方案的本质脱离本发明各实施例技术方案的范围。当前第1页1 2 3 当前第1页1 2 3 
当前第1页1 2 3 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1