Spring事务管理只对出现运行期异常进行回滚

2016-02-19 11:36 45 1 收藏

今天图老师小编要向大家分享个Spring事务管理只对出现运行期异常进行回滚教程,过程简单易学,相信聪明的你一定能轻松get!

【 tulaoshi.com - 编程语言 】

一、结论
Spring的事务管理默认只对出现运行期异常(java.lang.RuntimeException及其子类)进行回滚。
如果一个方法抛出Exception或者Checked异常,Spring事务管理默认不进行回滚。
关于异常的分类一下详细介绍:
1、基本概念
看java的异常结构图
 
Throwable是所有异常的根,java.lang.Throwable
Error是错误,java.lang.Error
Exception是异常,java.lang.Exception
2、Exception
一般分为Checked异常和Runtime异常,所有RuntimeException类及其子类的实例被称为Runtime异常,不属于该范畴的异常则被称为CheckedException。
①Checked异常
只有java语言提供了Checked异常,Java认为Checked异常都是可以被处理的异常,所以Java程序必须显示处理Checked异常。如果程序没有处理Checked异常,该程序在编译时就会发生错误无法编译。这体现了Java的设计哲学:没有完善错误处理的代码根本没有机会被执行。对Checked异常处理方法有两种
(1) 当前方法知道如何处理该异常,则用try...catch块来处理该异常。
(2) 当前方法不知道如何处理,则在定义该方法是声明抛出该异常。
代码如下:

package cn.xy.test;
import java.io.IOException;
/**
* Checked异常测试方法
* @author xy
*
*/
public class CheckedExceptionMethods
{
// 总异常类,既有checkedException又有RuntimeException,所以其中的checkedException必须处理
public void method1() throws Exception
{
System.out.println("我是抛出异常总类的方法");
}
// 捕获并处理这个异常
public void testMethod1_01()
{
try
{
method1();
}
catch (Exception e)
{
e.printStackTrace();
}
}
// 把异常传递下去
public void testMethod1_02() throws Exception
{
method1();
}
public void testMethod1_03() throws Exception
{
throw new Exception();
}
public void testMethod1_04()
{
try
{
throw new Exception();
}
catch (Exception e)
{
e.printStackTrace();
}
}
// checkedException典型代表IOException
public void method2() throws IOException
{
System.out.println("我是抛出IO异常的方法");
}
public void testMethod2_01()
{
try
{
method2();
}
catch (Exception e)
{
e.printStackTrace();
}
}
public void testMethod2_02() throws Exception
{
method2();
}
}

我们比较熟悉的Checked异常有
Java.lang.ClassNotFoundException
Java.lang.NoSuchMetodException
java.io.IOException
②RuntimeException
Runtime如除数是0和数组下标越界等,其产生频繁,处理麻烦,若显示申明或者捕获将会对程序的可读性和运行效率影响很大。所以由系统自动检测并将它们交给缺省的异常处理程序。当然如果你有处理要求也可以显示捕获它们。
代码如下:

package cn.xy.test;
/**
* 运行时异常测试方法
* @author xy
*
*/
public class RuntimeExcetionMethods
{
public void method3() throws RuntimeException
{
System.out.println("我是抛出运行时异常的方法");
}
public void testMethod3_01()
{
method3();
}
public void testMethod1_02()
{
throw new RuntimeException();
}
}

我们比较熟悉的RumtimeException类的子类有
Java.lang.ArithmeticException
Java.lang.ArrayStoreExcetpion
Java.lang.ClassCastException
Java.lang.IndexOutOfBoundsException
Java.lang.NullPointerException
3、Error
当程序发生不可控的错误时,通常做法是通知用户并中止程序的执行。与异常不同的是Error及其子类的对象不应被抛出。
Error是throwable的子类,代表编译时间和系统错误,用于指示合理的应用程序不应该试图捕获的严重问题。
Error由Java虚拟机生成并抛出,包括动态链接失败,虚拟机错误等。程序对其不做处理。
二、改变默认方式
在@Transaction注解中定义noRollbackFor和RollbackFor指定某种异常是否回滚。
@Transaction(noRollbackFor=RuntimeException.class)
@Transaction(RollbackFor=Exception.class)
这样就改变了默认的事务处理方式。
三、启示
这就要求我们在自定义异常的时候,让自定义的异常继承自RuntimeException,这样抛出的时候才会被Spring默认的事务处理准确处理。

(本文来源于图老师网站,更多请访问https://www.tulaoshi.com/bianchengyuyan/)

来源:https://www.tulaoshi.com/n/20160219/1597966.html

延伸阅读
标签: 生活常识
回南天什么时候出现 图老师阅读配图   回南天,南方人最怕提起来的事情,那么什么时候回南天出现呢?掌握了什么时候回南天出现的规律就会做好预防,对大家的生活环境会起到很好的保护作用,你难道不想了解一下吗? 回南天是天气返潮现象,那么,什么时候回南天出现呢?一般出现在春季的二三月份。 了解了什么时候回南天出...
5.4.1 什么是作业 作业是数据库服务器的一些自动化、标准化的管理工作。比如定时的数据库关闭或启动、定时执行数据库的恢复或备份等。 5.4.2 作业的作用 可以利用统一的作业库进行集中管理。 利用提供的作业系统,既可以在本地数据库服务器上运行本地作业,也可以通过来集中管理分布式数据库系统的多节点作业。 ...
怎么管理iphone后台运行的程序? 怎么管理后台运行的程序? 1. 按两下主屏幕按钮后,出现程序图标滑动图标便会出现更多的程序图标。多任务处理功能并没有通过牺牲电池续航以及前端软件性能为代价来实现的。有了它我们可以真正完成边收邮件、边听音乐、边建立文件的操作。 2. 出现图标后,按住某一图标便会出现关闭图标,关闭...
节日当防性过激 编者按:又临“五一”长假,情投意合的恋人忙新婚,两地分居的夫妻喜团聚。就连平日里早出TuLaoShi.com晚归忙于工作疏于体贴的小两口,此时也多了一份难得的相依相伴。有了闲暇和心情,节假日里的“性健康”就成了我们关注的一个话题。节日里性生活有哪些禁忌?新婚夫妇如何安度“人生初夜”?聆听一下来自专家的建议和读者的...
标签: 电脑入门
方法/步骤 故障一:内存条与主板插槽接触不良、内存控制器出现故障表现为:打开主机电源后屏幕显示Error :Unable to ControlA20 Line 出错信息后死机。 解决方法:仔细检查内存条是否与插槽保持良好接触或更换内存条。 故障二:自检通过。在DOS 状态下运行应用程序因占用的内存地址冲突,而导致内存分配错误,屏幕出现Memory A11ocationErr...

经验教程

633

收藏

67
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部