springboot数据库回滚失败原因

简介: 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://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();,这样就可以回滚成功。

相关文章
|
3月前
|
Java 数据库连接 测试技术
SpringBoot入门 - 添加内存数据库H2
SpringBoot入门 - 添加内存数据库H2
128 3
SpringBoot入门 - 添加内存数据库H2
|
8天前
|
JavaScript NoSQL Java
基于SpringBoot+Vue实现的大学生就业服务平台设计与实现(系统源码+文档+数据库+部署等)
面向大学生毕业选题、开题、任务书、程序设计开发、论文辅导提供一站式服务。主要服务:程序设计开发、代码修改、成品部署、支持定制、论文辅导,助力毕设!
34 6
|
8天前
|
JavaScript NoSQL Java
基于SpringBoot+Vue的班级综合测评管理系统设计与实现(系统源码+文档+数据库+部署等)
✌免费选题、功能需求设计、任务书、开题报告、中期检查、程序功能实现、论文辅导、论文降重、答辩PPT辅导、会议视频一对一讲解代码等✌
25 4
|
8天前
|
JavaScript NoSQL Java
基于SpringBoot+Vue实现的大学生体质测试管理系统设计与实现(系统源码+文档+数据库+部署)
面向大学生毕业选题、开题、任务书、程序设计开发、论文辅导提供一站式服务。主要服务:程序设计开发、代码修改、成品部署、支持定制、论文辅导,助力毕设!
22 2
|
12天前
|
前端开发 Java 数据库连接
Java后端开发-使用springboot进行Mybatis连接数据库步骤
本文介绍了使用Java和IDEA进行数据库操作的详细步骤,涵盖从数据库准备到测试类编写及运行的全过程。主要内容包括: 1. **数据库准备**:创建数据库和表。 2. **查询数据库**:验证数据库是否可用。 3. **IDEA代码配置**:构建实体类并配置数据库连接。 4. **测试类编写**:编写并运行测试类以确保一切正常。
27 2
|
8天前
|
JavaScript NoSQL Java
基于SpringBoot+Vue实现的冬奥会科普平台设计与实现(系统源码+文档+数据库+部署)
面向大学生毕业选题、开题、任务书、程序设计开发、论文辅导提供一站式服务。主要服务:程序设计开发、代码修改、成品部署、支持定制、论文辅导,助力毕设!
23 0
|
3月前
|
Java 关系型数据库 数据库连接
使用 Spring Boot 执行数据库操作:全面指南
使用 Spring Boot 执行数据库操作:全面指南
249 1
|
8天前
|
关系型数据库 MySQL 数据库连接
数据库连接工具连接mysql提示:“Host ‘172.23.0.1‘ is not allowed to connect to this MySQL server“
docker-compose部署mysql8服务后,连接时提示不允许连接问题解决
|
12天前
|
缓存 关系型数据库 MySQL
【深入了解MySQL】优化查询性能与数据库设计的深度总结
本文详细介绍了MySQL查询优化和数据库设计技巧,涵盖基础优化、高级技巧及性能监控。
116 0
|
2月前
|
存储 Oracle 关系型数据库
数据库传奇:MySQL创世之父的两千金My、Maria
《数据库传奇:MySQL创世之父的两千金My、Maria》介绍了MySQL的发展历程及其分支MariaDB。MySQL由Michael Widenius等人于1994年创建,现归Oracle所有,广泛应用于阿里巴巴、腾讯等企业。2009年,Widenius因担心Oracle收购影响MySQL的开源性,创建了MariaDB,提供额外功能和改进。维基百科、Google等已逐步替换为MariaDB,以确保更好的性能和社区支持。掌握MariaDB作为备用方案,对未来发展至关重要。
65 3