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