springboot数据库回滚失败原因

更多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<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();,这样就可以回滚成功。

相关推荐

  1. springboot数据库失败原因

    2024-01-12 04:12:01       36 阅读
  2. logback日志原理

    2024-01-12 04:12:01       19 阅读
  3. Oracle 误删数据

    2024-01-12 04:12:01       9 阅读
  4. SpringCloud跨服务调用失败Seata无法解决办法

    2024-01-12 04:12:01       33 阅读
  5. Hudi Spark Sql Procedures Hudi 表数据

    2024-01-12 04:12:01       8 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-01-12 04:12:01       19 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-01-12 04:12:01       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-01-12 04:12:01       19 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-01-12 04:12:01       20 阅读

热门阅读

  1. QObject_thread

    2024-01-12 04:12:01       38 阅读
  2. leetcode 659. 分割数组为连续子序列

    2024-01-12 04:12:01       35 阅读
  3. Gorm实战,轻松掌握数据库增删改查技巧!

    2024-01-12 04:12:01       33 阅读
  4. 缓存数据库双写不一致

    2024-01-12 04:12:01       36 阅读
  5. 记录来到这的第一天!

    2024-01-12 04:12:01       30 阅读
  6. 算法-大数相乘

    2024-01-12 04:12:01       41 阅读
  7. 现在都在说 Docker 好,那它有什么弊端吗?

    2024-01-12 04:12:01       33 阅读