美文网首页
ActivitiOptimisticLockingExcepti

ActivitiOptimisticLockingExcepti

作者: a_simple_coder | 来源:发表于2020-07-24 20:16 被阅读0次
    org.activiti.engine.ActivitiOptimisticLockingException: 
    Task[id=dgdfccc542755, name=申请人] 
    was updated by another transaction concurrently
    at org.activiti.engine.impl.db.DbSqlSession.flushUpdates(DbSqlSession.java:872) 
    
    

    代码如下:

    //更新Task
    managementService.executeCommand(new SaveTaskCmd(task)); 
    
    

    这个是由于在更新task时,参数task的版本rev_与数据库中的task版本不一致导致的,最终,这句执行的sql如下:

    update ACT_RU_TASK
    set
    re_=4, name="申请人",//后面的设置省略
    where id_="dgdfccc542755" and rev_=3; 
    
    

    而此时,数据库中,该条task的rev_的值为4,与参数task的版本不一致,所以更新失败。
    导致这个问题是因为:

    先获取task,然后执行了task的签收或转发操作(这些都会更新task的信息),然后用开始获取的task去更新数据库,比如我在更新task前面执行了taskService.delegateTask,这部分代码为:

    Task task = getTaskByTaskId(taskId); 
    if(null=task)throw new Exception ("任务不存在"); 
    
    taskService.delegateTask(taskId); 
    
    task.setDescription("测试");
    //更新Task
    managementService.executeCommand(new SaveTaskCmd(task)); 
    
    

    如果想更新task,需要在更新时获取数据库中最新的task然后再赋值,再更新到数据库!

    Task taskTemp = getTaskByTaskId(taskId); 
    if(null= taskTemp)throw new Exception ("任务不存在"); 
    
    taskService.delegateTask(taskId); 
    
    Task task = getTaskByTaskId(taskId); 
    task.setDescription("测试");
    
    //更新Task
    managementService.executeCommand(new SaveTaskCmd(task)); 
    
    

    相关文章

      网友评论

          本文标题:ActivitiOptimisticLockingExcepti

          本文链接:https://www.haomeiwen.com/subject/eadslktx.html