概述
文章目录
- 背景
- activiti乐观锁的实现过程
背景
学习activiti的乐观锁实现过程,可以先理解complete工作过程
在多个线程同时操作同一个taskId的时候,activiti是怎么解决并发问题的?
过程
activiti使用乐观锁(Optimistic Locking)做的并发控制
一旦并发冲突(多个线程同时操作同一个taskId的时候)发生的时候,一个异常OptimisticLockingException就会被抛出来,同时事务也将回滚。检测到冲突发生的时候,其实是多个线程同时对同一个数据进行写操作。
activiti的默认表有一个关键字段REV_
比如表ACT_RU_EXECUTION, ACT_RU_TASK都有字段REV_。 这个字段是单词:reversion
含义就是:reversion version。其实就是做的一个乐观锁。
activiti乐观锁的实现过程
假如现在有两个A和B线程同时执行complete操作了。且都是对同一个taskId进行complete操作。
A线程拿到Task相关数据,此时字段REV_的值是1
B线程也拿到Task相关数据,此时字段REV_的值也是1
其实,这个时候A和B线程都是ativiti提供的job executor线程池中的线程。假如这个taskId是会签,而且activiti在设计的时候,同一个审批实例就只能有一个线程在处理这个taskId。
A线程完成了这个任务,并且把REV_的值更新为2。
现在B线程也完成这个任务,但是在更新REV_值的时候,发现数据库返回受影响的行数为0(已被执行 RUN 表数据会硬删),这个时候就抛出了一个异常:OptimisticLockingException,并打印出日志信息(ProcessInstance[dsljfljdfljkdflajfla12324ldjfldkjf] was updated by another transaction concurrently)。
此描述的过程就是activiti对并发控制的实现过程。也是乐观锁工作过程。
业务处理结果
捕获到异常,进行友好提示。此审批单抢先被审批。
参考:
https://blog.csdn.net/outsanding/article/details/107868624 (Activiti7.0进阶学习(六):Activiti的乐观锁实现过程)
最后
以上就是搞怪鱼为你收集整理的Activiti的乐观锁实现过程背景activiti乐观锁的实现过程的全部内容,希望文章能够帮你解决Activiti的乐观锁实现过程背景activiti乐观锁的实现过程所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复