activiti乐观锁实现

本文介绍了乐观锁的概念和与悲观锁的区别,指出乐观锁适用于并发访问较低且冲突较少的场景。文章提供了数据版本记录机制作为乐观锁的实现方式,并展示了在activiti中使用SQL和Java代码实现乐观锁的例子,当更新记录时检测版本号是否一致,以防止并发冲突。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

理论部分参考:http://chenzhou123520.iteye.com/blog/1863407

谈到了MySQL悲观锁,但是悲观锁并不是适用于任何场景,它也有它存在的一些不足,因为悲观锁大多数情况下依靠数据库的锁机制实现,以保证操作最大程度的独占性。如果加锁的时间过长,其他用户长时间无法访问,影响了程序的并发访问性,同时这样对数据库性能开销影响也很大,特别是对长事务而言,这样的开销往往无法承受。所以与悲观锁相对的,我们有了乐观锁,具体参见下面介绍:

 

长事务的概念:

http://www.ibm.com/developerworks/cn/data/library/techarticles/dm-1001haodh/

把占用整个逻辑日志空间在一定比例以上的事务,就叫做“长事务”。“长事务”意味着可能由于跨越过多的日志文件,导致需要循环使用的日志文件不能及时释放。从而造成数据库系统挂起无法正常工作的可能性


乐观锁介绍:

乐观锁( Optimistic Locking ) 相对悲观锁而言,乐观锁假设认为数据一般情况下不会造成冲突,所以在数据进行提交更新的时候,才会正式对数据的冲突与否进行检测,如果发现冲突了,则让返回用户错误的信息,让用户决定如何去做。那么我们如何实现乐观锁呢,一般来说有如下方式:

使用数据版本(Version)记录机制实现,这是乐观锁最常用的一种实现方式。何谓数据版本?即为数据增加一个版本标识,一般是通过为数据库表增加一个数字类型的 “version” 字段来实现。当读取数据时,将version字段的值一同读出,数据每更新一次,对此version值加一。当我们提交更新的时候,判断数据库表对应记录的当前版本信息与第一次取出来的version值进行比对,如果数据库表当前版本号与第一次取出来的version值相等,则予以更新,否则认为是过期数据。


乐观锁的实现

REV_  SQL:

    update ${prefix}ACT_RU_EXECUTION set

      REV_ = #{revisionNext, jdbcType=INTEGER},

      BUSINESS_KEY_ = #{businessKey, jdbcType=VARCHAR}

    where ID_ = #{id, jdbcType=VARCHAR}

      and REV_ = #{revision, jdbcType=INTEGER}


代码:

      int updatedRecords = sqlSession.update(updateStatement, updatedObject);

      if (updatedRecords!=1) {

        throw new ActivitiOptimisticLockingException(updatedObject + " was updated by another transaction concurrently");

      } 

      





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值