更多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://122.227.135.243:9888
今天在用流程启动的时候出现错误,结果相应的事务没有回滚,我主要是用下面语句
@Override@Transactional(rollbackFor = Exception.class)public R startProcessByDataId(String dataId, String serviceName, Map 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 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 startProcessByDataId(String dataId, String serviceName, Map 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 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();,这样就可以回滚成功。