flowable: parent 'xxxxxx' was updated by another transaction concurrently


先看下我的代碼:

    /**
     * 認領
     * @param request
     * @return
     */
    @Transactional
    public ReturnVo claim(ClaimRequest request){
        // 流程實例ID
        String procId = request.getProcessInstanceId();
        // 查詢實例上的所有呼叫人員
        StartCallerRequest startCallerRequest = new StartCallerRequest();
        startCallerRequest.setProcessInstanceId(procId);
        List<StartCallersModel> callers = startCallerMapper.query(startCallerRequest);
        // 把沒傳遞過來的呼叫人員刪除(刪除活動)
        List<String> deleteUserIds = new ArrayList<>();
        for (StartCallersModel caller: callers) {
            boolean exist = false;
            for (String userId: request.getUserIds()) {
                if(userId.equals(caller.getUserId())){
                    exist = true;
                    break;
                }
            }
            if(!exist){
                deleteUserIds.add(caller.getUserId());
            }
        }

        //查詢需要刪除的活動(任務),並刪除
        if (deleteUserIds.size() > 0){
            List<org.flowable.task.api.Task> tasks = taskService.createTaskQuery().processInstanceId(procId)
                    .taskDefinitionKey("claim").taskAssigneeIds(deleteUserIds).list();
            for (org.flowable.task.api.Task task: tasks) {
                try{
                    Execution execution =  runtimeService.createExecutionQuery().executionId(task.getExecutionId()).singleResult();
                    runtimeService.deleteMultiInstanceExecution(execution.getId(), false);
                }
                catch(Exception e){
                    throw e;
                }
            }
        }

        // 查詢需要認領的任務並自動審批通過
        List<org.flowable.task.api.Task> tasks1 = taskService.createTaskQuery().processInstanceId(procId).taskDefinitionKey("claim").list();
        for (org.flowable.task.api.Task task : tasks1) {
            //設置流程執行人
            identityService.setAuthenticatedUserId(task.getAssignee());
            //添加批注
            taskService.addComment(task.getId(), procId, TaskEnum.Agree.toString(), "事件認領");
            //完成任務
            Map<String,Object> paras = new HashMap<>();
            paras.put("assignee", task.getAssignee());
            taskService.complete(task.getId(), paras);
        }

        //更新認領狀態
        for (String userId : request.getUserIds()) {
            //構造查詢條件
            startCallerRequest = new StartCallerRequest();
            startCallerRequest.setProcessInstanceId(procId);
            startCallerRequest.setUserId(userId);

            List<StartCallersModel> models = startCallerMapper.query(startCallerRequest);
            if(models.size() > 0){
                StartCallersModel model = models.get(0);
                model.setClaimed(true);
                startCallerMapper.update(model);
            }
        }

        //刪除[執行認領]中的任務
        if (deleteUserIds.size() > 0){
            List<org.flowable.task.api.Task> tasks = taskService.createTaskQuery().processInstanceId(procId)
                    .taskDefinitionKey("execute_claim").taskAssigneeIds(deleteUserIds).list();
            for (org.flowable.task.api.Task task: tasks) {
                Execution execution =  runtimeService.createExecutionQuery().executionId(task.getExecutionId()).singleResult();
                runtimeService.deleteMultiInstanceExecution(execution.getId(), false);
            }
        }

        return new ReturnVo(ReturnCode.SUCCESS,"執行認領成功");
    }

先說下我的需求:

1.有一個節點:[執行認領]

2.有10個人,默認情況下10個人都動態分配到了該節點

3.那么假如有5/6/7個人執行該節點,允許審批通過

4.所以我要把剩余的5/4/3個人從節點中動態刪除

5.然后就遇到了該問題

 

解決方案:添加 @Transactional 注解。至於原因我也不知道,被我給懵對了。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM