要保证在循环过程中报错会触发全部的事务回滚,可以将循环体内的代码块提取为一个独立的方法,并在该方法上添加事务注解。然后在循环体内调用该方法即可。

修改后的代码如下所示:

@PostMapping("startProcessBatch")
public List<JsonResult> startProcessBatch(@ApiParam @RequestBody List<ProcessStartCmd> startCmdList) {
    List<JsonResult> result = new ArrayList<>();
    for (ProcessStartCmd startCmd : startCmdList) {
        try {
            JsonResult jsonResult = startProcess(startCmd);
            result.add(jsonResult);
        } catch (Exception e) {
            result.add(null);
        }
    }
    return result;
}

@Transactional(rollbackFor = Exception.class)
public JsonResult startProcess(ProcessStartCmd startCmd) {
    JsonResult jsonResult = handReq(startCmd);
    if (!jsonResult.isSuccess()) {
        return jsonResult;
    }
    BpmDef bpmDef = (BpmDef) jsonResult.getData();
    boolean hasRight = systemClient.findAuthRight("BPM", "def.start", bpmDef.getTreeId());
    if (!hasRight) {
        return JsonResult.Fail("你没有启动权限!");
    }

    String operate = startCmd.isHasPk() ? ProcessStartCmd.OPERATE_LIVE : ProcessStartCmd.OPERATE_START;
    try {
        //启动流程
        BpmInst bpmInst = bpmInstService.doStartProcess(startCmd, bpmDef, operate);
        jsonResult.setDetailMsg(JSON.toJSON(startCmd.getVars()).toString());
        //发送任务消息通知
        messageService.sendMsg();
        return jsonResult.setData(bpmInst)
                .setSuccess(true).setMessage("成功启动流程!");
    } catch (Exception e) {
        bpmInstService.handStartException(e);
        throw e;
    }
}

通过将循环体内的代码提取为一个独立的方法并添加事务注解@Transactional(rollbackFor = Exception.class),可以保证在循环过程中如果发生异常,将会触发全部的事务回滚

这个接口 PostMappingstartProcessBatch public ListJsonResult startProcessBatchApiParam RequestBody ListProcessStartCmd startCmdList ListJsonResult result = new ArrayList; for ProcessSt

原文地址: https://www.cveoy.top/t/topic/iw4r 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录