更多ruoyi-nbcio功能请看演示系统
gitee源代码地址
前后端代码: https://gitee.com/nbacheng/ruoyi-nbcio
演示地址:RuoYi-Nbcio后台管理系统
更多nbcio-boot功能请看演示系统
gitee源代码地址
后端代码: https://gitee.com/nbacheng/nbcio-boot
前端代码:https://gitee.com/nbacheng/nbcio-vue.git
在线演示(包括H5) : http://218.75.87.38:9888
今天在用流程启动的时候出现错误,结果相应的事务没有回滚,我主要是用下面语句
@Override @Transactional(rollbackFor = Exception.class) public R<Void> startProcessByDataId(String dataId, String serviceName, Map<String, Object> variables) { //提交审批的时候进行流程实例关联初始化 if (serviceName==null){ return R.fail("未找到serviceName:"+serviceName); } WfCustomForm wfCustomForm = wfCustomFormService.selectSysCustomFormByServiceName(serviceName); if(wfCustomForm ==null){ return R.fail("未找到sysCustomForm:"+serviceName); } //优先考虑自定义业务表是否关联流程,再看通用的表单流程关联表 ProcessDefinition processDefinition; String deployId = wfCustomForm.getDeployId(); if(StringUtils.isEmpty(deployId)) { WfDeployForm sysDeployForm = deployFormMapper.selectSysDeployFormByFormId("key_"+String.valueOf(wfCustomForm.getId())); if(sysDeployForm ==null){ return R.fail("自定义表单也没关联流程定义表,流程没定义关联自定义表单"+wfCustomForm.getId()); } processDefinition = repositoryService.createProcessDefinitionQuery() .parentDeploymentId(sysDeployForm.getDeployId()).latestVersion().singleResult(); } else { processDefinition = repositoryService.createProcessDefinitionQuery() .parentDeploymentId(deployId).latestVersion().singleResult(); } try { LambdaQueryWrapper<WfMyBusiness> wfMyBusinessLambdaQueryWrapper = new LambdaQueryWrapper<>(); wfMyBusinessLambdaQueryWrapper.eq(WfMyBusiness::getDataId, dataId); WfMyBusiness business = wfMyBusinessService.getOne(wfMyBusinessLambdaQueryWrapper); if (business==null){ if(processDefinition==null) { return R.fail("自定义表单也没关联流程定义表,流程没定义关联自定义表单"+wfCustomForm.getId()); } boolean binit = wfCommonService.initActBusiness(wfCustomForm.getBusinessName(), dataId, serviceName, processDefinition.getKey(), processDefinition.getId(), wfCustomForm.getRouteName()); if(!binit) { return R.fail("自定义表单也没关联流程定义表,流程没定义关联自定义表单"+wfCustomForm.getId()); } WfMyBusiness businessnew = wfMyBusinessService.getOne(wfMyBusinessLambdaQueryWrapper); //流程实例关联初始化结束 if (StrUtil.isNotBlank(businessnew.getProcessDefinitionId())){ return this.startProcessByDefId(businessnew.getProcessDefinitionId(),variables); } return this.startProcessByDefKey(businessnew.getProcessDefinitionKey(),variables); } else { return R.fail("已经存在这个dataid实例,不要重复申请:"+dataId); } } catch (Exception e) { e.printStackTrace(); return R.fail("流程启动错误"); } }
结果实际数据没有回滚。
根据相关资料,由于异常被catch, 不阻断整个事务执行。所以应该是这里出现问题
可以不用try catch,或者就是需要修改如下:
@Override @Transactional(rollbackFor = Exception.class) public R<Void> startProcessByDataId(String dataId, String serviceName, Map<String, Object> variables) { //提交审批的时候进行流程实例关联初始化 if (serviceName==null){ return R.fail("未找到serviceName:"+serviceName); } WfCustomForm wfCustomForm = wfCustomFormService.selectSysCustomFormByServiceName(serviceName); if(wfCustomForm ==null){ return R.fail("未找到sysCustomForm:"+serviceName); } //优先考虑自定义业务表是否关联流程,再看通用的表单流程关联表 ProcessDefinition processDefinition; String deployId = wfCustomForm.getDeployId(); if(StringUtils.isEmpty(deployId)) { WfDeployForm sysDeployForm = deployFormMapper.selectSysDeployFormByFormId("key_"+String.valueOf(wfCustomForm.getId())); if(sysDeployForm ==null){ return R.fail("自定义表单也没关联流程定义表,流程没定义关联自定义表单"+wfCustomForm.getId()); } processDefinition = repositoryService.createProcessDefinitionQuery() .parentDeploymentId(sysDeployForm.getDeployId()).latestVersion().singleResult(); } else { processDefinition = repositoryService.createProcessDefinitionQuery() .parentDeploymentId(deployId).latestVersion().singleResult(); } try { LambdaQueryWrapper<WfMyBusiness> wfMyBusinessLambdaQueryWrapper = new LambdaQueryWrapper<>(); wfMyBusinessLambdaQueryWrapper.eq(WfMyBusiness::getDataId, dataId); WfMyBusiness business = wfMyBusinessService.getOne(wfMyBusinessLambdaQueryWrapper); if (business==null){ if(processDefinition==null) { return R.fail("自定义表单也没关联流程定义表,流程没定义关联自定义表单"+wfCustomForm.getId()); } boolean binit = wfCommonService.initActBusiness(wfCustomForm.getBusinessName(), dataId, serviceName, processDefinition.getKey(), processDefinition.getId(), wfCustomForm.getRouteName()); if(!binit) { return R.fail("自定义表单也没关联流程定义表,流程没定义关联自定义表单"+wfCustomForm.getId()); } WfMyBusiness businessnew = wfMyBusinessService.getOne(wfMyBusinessLambdaQueryWrapper); //流程实例关联初始化结束 if (StrUtil.isNotBlank(businessnew.getProcessDefinitionId())){ return this.startProcessByDefId(businessnew.getProcessDefinitionId(),variables); } return this.startProcessByDefKey(businessnew.getProcessDefinitionKey(),variables); } else { return R.fail("已经存在这个dataid实例,不要重复申请:"+dataId); } } catch (Exception e) { e.printStackTrace(); throw new RuntimeException(); } }
在catch里扔出throw new RuntimeException();,这样就可以回滚成功。