今天找了一个之前小伙伴写的bug代码,大致内容如下:

try {
                System.out.println("调用接口处理开始");
                feePersonAdd=this.feePerson(null, null, prpSverifyDetail.getVerifyType(), userCodeStr);//主要是保存报文操作
                System.out.println("调用口处理结束");
            } catch (Exception e) {
                e.printStackTrace();
            }
            if(!feePersonAdd){
                throw new BusinessException("任务预处理时发生异常。调用接口失败。", false);
            }

可以看到在进行一系列操作之后,如果出现异常,则最后执行 throw new  BusinessException("任务预处理时发生异常。调用接口失败。", false); 这就导致会将失败的报文丢失掉,最终结果是,如果调用成功,则报文可以正常保存,如果调用失败,则报文丢失,为什么为造成这样的现象呢?

那是因为在写代码的时候没有考虑到Spring的事物机制,默认spring事务只在发生未被捕获的 runtimeexcetpion时才回滚,而BusinessException类是继承了RuntimeException 。

如果使用声明式事务管理,@Transactional,默认情况下所有的RuntimeException会触发回滚,所有的checked Exception不会触发回滚,可以通过rollback-for和no-rollback-for来调整配置,如果单单只是 catch异常,没有抛出,则异常没办法到事务管理器中,不会触发回滚操作。简单点可以理解为:使用 throw  RuntimeException  则事务会回滚。

针对以上代码,解决方案为重新申明一个session事务,用来单独提交保存报文这个事务:

Session session = super.getHibernateTemplate().getSessionFactory().openSession();
     Transaction transaction = session.beginTransaction();
     session.saveOrUpdate(xmlMessage);
     transaction.commit();
     session.close();

在开发过程中常见的RuntimeException类型的异常主要有以下几种:
 ArithmeticException:数学计算异常。
 NullPointerException:空指针异常。
 NegativeArraySizeException:负数组长度异常。
 ArrayOutOfBoundsException:数组索引越界异常。
 ClassNotFoundException:类文件未找到异常。
 ClassCastException:类型强制转换异常。
 SecurityException:违背安全原则异常。
IllegalArgumentException- 传递非法参数异常
ArrayStoreException - 向数组中存放与声明类型不兼容对象异常
IndexOutOfBoundsException - 下标越界异常
NumberFormatException - 数字格式异常
UnsupportedOperationException - 不支持的操作异常

其他非RuntimeException类型的常见异常主要有以下几种:
NoSuchMethodException:方法未找到异常。
 IOException:输入输出异常。
EOFException:文件已结束异常。
FileNotFoundException:文件未找到异常。
NumberFormatException:字符串转换为数字异常。
SQLException:操作数据库异常

java事务异常 try catch throw new BusinessException相关推荐

  1. java异常没有catch住_今天才真正了解Java的异常处理

    异常是程序中的一些错误,但并不是所有的错误都是异常,并且错误有时候是可以避免的. 异常发生的原因有很多,通常包含以下几大类: 1.用户输入了非法数据. 2.要打开的文件不存在. 3.网络通信时连接中断 ...

  2. java方法后面throw的作用_Java异常处理中throw与throws的用法区别

    前言 说到异常,我们当然会想到try catch finally.当然如果用这个的话,被try块包围的代码说明这段代码可能会发生异常,一旦发生异常,异常便会被catch捕获到,然后需要在catch块中 ...

  3. java事务中使用try catch 导致事务不回滚的问题

    @Transactional注解的触发,只回滚RuntimeException和Error异常,默认不回滚非RuntimeException异常 解决方法: 1.方法前添加注解(基础的  @Trans ...

  4. Spring事务异常回滚,try catch 捕获异常不回滚

    Spring事务异常回滚,try catch 捕获异常不回滚 参考文章: (1)Spring事务异常回滚,try catch 捕获异常不回滚 (2)https://www.cnblogs.com/GH ...

  5. java的异常抛出throws和throw的简单使用

    java的异常抛出throws和throw的简单使用 参考文章: (1)java的异常抛出throws和throw的简单使用 (2)https://www.cnblogs.com/Anxc/p/113 ...

  6. java hexits,[Java]浅谈Java的异常体系

    为什么需要异常 理想的情况下,程序是不会有BUG的.但是现实的情况是:处处都可能引发BUG,比如一个糟糕的输入.需要访问的资源不存在.网络出现抖动.服务器资源不足等等.这就要求我们的程序需要一个机制来 ...

  7. java事务什么时候回滚_spring事务什么时候会自动回滚

    在java中异常的基类为Throwable,他有两个子类xception与Errors.同时RuntimeException就是Exception的子类,只有RuntimeException才会进行回 ...

  8. java 抛异常给上级_java异常处理机制(示例代码)

    Exception 类的层次 java中所有的异常类是从 java.lang.Exception 类继承的子类. 而Exception 类是 Throwable (可抛出的)类的子类.除了Except ...

  9. java initcause_Java 异常

    问:java 异常有哪几种,特点是什么? 答:异常是发生在程序执行过程中阻碍程序正常执行的错误操作,只要在 Java 语句执行中产生异常,则一个异常对象就会被创建. Throwable 是所有异常的父 ...

最新文章

  1. java一段时间后执行一块代码_java自带的ScheduledExecutorService定时任务正常执行一段时间后部分任务不执行...
  2. 肝!用 Highcharts 绘制饼图,也很强大
  3. 加快mysql导入、导出速度
  4. java.net.SocketException: Software caused connection abort: socket write erro
  5. (数据科学学习手札03)Python与R在随机数生成上的异同
  6. Vue.js 内部运行机制之总结 常见问题解答
  7. leetcode------Binary Tree Level Order Traversal II
  8. 怎么用spss做冗余分析_【攻略】手把手教你怎么用SPSS做统计分析
  9. win10系统QQ音乐安装包无法打开解决方法!
  10. 基本知识 100151
  11. ubuntu几款好用的代码编辑器
  12. 计算机中临时存储数据指令的部件,第一单元 探索计算机的奥秘
  13. ipad无法充电怎么办_ipad不能充电怎么办 6种办法快速解决
  14. 在word表格中如何快速清除表格内容?
  15. 信源编码作业【01】利用Audacity软件语音信号的频谱分析
  16. Activiti Designer申请请假流程
  17. 什么是XSL?(XSL概述)
  18. Word 2003 长篇文档排版技巧(一)
  19. 知识追踪之动态键值对记忆网络 Dynamic Key-Value Memory Networks for Knowledge Tracing
  20. C语言入门 - 什么是递归?

热门文章

  1. 关于如何把C盘缓存转移到别的位置(VRchat)
  2. 软考A计划-重点考点-专题六(数据库知识)
  3. Facebook蓝光存储数据中心的节能应用
  4. Windows Server 2012 RemoteApp体验-多服务器部署(1)
  5. 不受限时间段的日期范围选择器DatePicker
  6. 关于office2016突然无法启动的解决方法(只是针对某一问题)
  7. linux运行文件命令
  8. (Java毕业设计)茶室客户自带茶品管理系统(附源码+论文)
  9. 免费!终极ChatGPT提示+Midjourney宝藏神图,1200+图片,震撼人心
  10. 生怕认可java+flatmap,RxJava 操作符flatMap 与 concatMap详解