java事务异常 try catch throw new BusinessException
今天找了一个之前小伙伴写的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相关推荐
- java异常没有catch住_今天才真正了解Java的异常处理
异常是程序中的一些错误,但并不是所有的错误都是异常,并且错误有时候是可以避免的. 异常发生的原因有很多,通常包含以下几大类: 1.用户输入了非法数据. 2.要打开的文件不存在. 3.网络通信时连接中断 ...
- java方法后面throw的作用_Java异常处理中throw与throws的用法区别
前言 说到异常,我们当然会想到try catch finally.当然如果用这个的话,被try块包围的代码说明这段代码可能会发生异常,一旦发生异常,异常便会被catch捕获到,然后需要在catch块中 ...
- java事务中使用try catch 导致事务不回滚的问题
@Transactional注解的触发,只回滚RuntimeException和Error异常,默认不回滚非RuntimeException异常 解决方法: 1.方法前添加注解(基础的 @Trans ...
- Spring事务异常回滚,try catch 捕获异常不回滚
Spring事务异常回滚,try catch 捕获异常不回滚 参考文章: (1)Spring事务异常回滚,try catch 捕获异常不回滚 (2)https://www.cnblogs.com/GH ...
- java的异常抛出throws和throw的简单使用
java的异常抛出throws和throw的简单使用 参考文章: (1)java的异常抛出throws和throw的简单使用 (2)https://www.cnblogs.com/Anxc/p/113 ...
- java hexits,[Java]浅谈Java的异常体系
为什么需要异常 理想的情况下,程序是不会有BUG的.但是现实的情况是:处处都可能引发BUG,比如一个糟糕的输入.需要访问的资源不存在.网络出现抖动.服务器资源不足等等.这就要求我们的程序需要一个机制来 ...
- java事务什么时候回滚_spring事务什么时候会自动回滚
在java中异常的基类为Throwable,他有两个子类xception与Errors.同时RuntimeException就是Exception的子类,只有RuntimeException才会进行回 ...
- java 抛异常给上级_java异常处理机制(示例代码)
Exception 类的层次 java中所有的异常类是从 java.lang.Exception 类继承的子类. 而Exception 类是 Throwable (可抛出的)类的子类.除了Except ...
- java initcause_Java 异常
问:java 异常有哪几种,特点是什么? 答:异常是发生在程序执行过程中阻碍程序正常执行的错误操作,只要在 Java 语句执行中产生异常,则一个异常对象就会被创建. Throwable 是所有异常的父 ...
最新文章
- java一段时间后执行一块代码_java自带的ScheduledExecutorService定时任务正常执行一段时间后部分任务不执行...
- 肝!用 Highcharts 绘制饼图,也很强大
- 加快mysql导入、导出速度
- java.net.SocketException: Software caused connection abort: socket write erro
- (数据科学学习手札03)Python与R在随机数生成上的异同
- Vue.js 内部运行机制之总结 常见问题解答
- leetcode------Binary Tree Level Order Traversal II
- 怎么用spss做冗余分析_【攻略】手把手教你怎么用SPSS做统计分析
- win10系统QQ音乐安装包无法打开解决方法!
- 基本知识 100151
- ubuntu几款好用的代码编辑器
- 计算机中临时存储数据指令的部件,第一单元 探索计算机的奥秘
- ipad无法充电怎么办_ipad不能充电怎么办 6种办法快速解决
- 在word表格中如何快速清除表格内容?
- 信源编码作业【01】利用Audacity软件语音信号的频谱分析
- Activiti Designer申请请假流程
- 什么是XSL?(XSL概述)
- Word 2003 长篇文档排版技巧(一)
- 知识追踪之动态键值对记忆网络 Dynamic Key-Value Memory Networks for Knowledge Tracing
- C语言入门 - 什么是递归?
热门文章
- 关于如何把C盘缓存转移到别的位置(VRchat)
- 软考A计划-重点考点-专题六(数据库知识)
- Facebook蓝光存储数据中心的节能应用
- Windows Server 2012 RemoteApp体验-多服务器部署(1)
- 不受限时间段的日期范围选择器DatePicker
- 关于office2016突然无法启动的解决方法(只是针对某一问题)
- linux运行文件命令
- (Java毕业设计)茶室客户自带茶品管理系统(附源码+论文)
- 免费!终极ChatGPT提示+Midjourney宝藏神图,1200+图片,震撼人心
- 生怕认可java+flatmap,RxJava 操作符flatMap 与 concatMap详解