Activiti7.0进阶学习(六):Activiti的乐观锁实现过程

背景
  1. 学习activiti的乐观锁实现过程,可以先理解complete工作过程
  2. 多个线程同时操作同一个taskId的时候,activiti是怎么解决并发问题的?
过程
  • activiti使用乐观锁(Optimistic Locking)做的并发控制
    一旦并发冲突(多个线程同时操作同一个taskId的时候)发生的时候,一个异常OptimisticLockingException就会被抛出来,同时事务也将回滚。检测到冲突发生的时候,其实是多个线程同时对同一个数据进行写操作。

  • activiti的默认表有一个关键字段REV_
    比如表ACT_RU_EXECUTION, ACT_RU_TASK都有字段REV_。 这个字段是单词:reversion
    含义就是:reversion version。其实就是做的一个乐观锁。

  • activiti乐观锁的实现过程

  1. 假如现在有两个A和B线程同时执行complete操作了。且都是对同一个taskId进行complete操作。
  2. A线程拿到Task相关数据,此时字段REV_的值是1
  3. B线程也拿到Task相关数据,此时字段REV_的值也是1
  4. 其实,这个时候A和B线程都是ativiti提供的job executor线程池中的线程。假如这个taskId是会签,而且activiti在设计的时候,同一个审批实例就只能有一个线程在处理这个taskId。
  5. A线程完成了这个任务,并且把REV_的值更新为2。
  6. 现在B线程也完成这个任务,但是在更新REV_值的时候,发现数据库返回受影响的行数为0,这个时候就抛出了一个异常:OptimisticLockingException,并打印出日志信息(ProcessInstance[dsljfljdfljkdflajfla12324ldjfldkjf] was updated by another transaction concurrently)。
  7. 此描述的过程就是activiti对并发控制的实现过程。也是乐观锁工作过程。
  • 业务处理结果
  1. 捕获到异常,进行业务逻辑重试。
  2. 捕获到异常,进行友好提示。此审批单抢先被审批,请再次重新审批。
小结
  1. 理解activiti是怎么解决并发问题的。
  2. 理解activiti乐观锁工作过程。
  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值