Spring的事务管理默认只对出现运行期异常(java.lang.RuntimeException及其子类)进行回滚,需要了解更多Spring事务方面的知识,可详看本文
<iframe id="iframeu2261530_0" style="display: block; border-width: 0px; border-style: initial; vertical-align: bottom; margin: 0px;" src="http://pos.baidu.com/acom?sz=680x200&rdid=2261530&dc=2&di=u2261530&dri=0&dis=0&dai=2&ps=418x465&coa=at%3D3%26rsi0%3D680%26rsi1%3D200%26pat%3D6%26tn%3DbaiduCustNativeAD%26rss1%3D%2523FFFFFF%26conBW%3D1%26adp%3D1%26ptt%3D0%26titFF%3D%2525E5%2525BE%2525AE%2525E8%2525BD%2525AF%2525E9%25259B%252585%2525E9%2525BB%252591%26titFS%3D14%26rss2%3D%2523000000%26titSU%3D0%26ptbg%3D90%26piw%3D0%26pih%3D0%26ptp%3D0&dcb=BAIDU_EXP_UNION_define&dtm=BAIDU_DUP_SETJSONADSLOT&dvi=0.0&dci=-1&dpt=none&tsr=703&tpr=1453277692666&ti=Spring%E4%BA%8B%E5%8A%A1%E7%AE%A1%E7%90%86%E5%8F%AA%E5%AF%B9%E5%87%BA%E7%8E%B0%E8%BF%90%E8%A1%8C%E6%9C%9F%E5%BC%82%E5%B8%B8%E8%BF%9B%E8%A1%8C%E5%9B%9E%E6%BB%9A_java_%E8%84%9A%E6%9C%AC%E4%B9%8B%E5%AE%B6&ari=1&dbv=2&drs=1&pcs=1920x1030&pss=1920x424&cfv=0&cpl=4&chi=1&cce=true&cec=GBK&tlm=1451314291&ltu=http%3A%2F%2Fwww.jb51.net%2Farticle%2F32246.htm&ltr=https%3A%2F%2Fwww.baidu.com%2Flink%3Furl%3DgWSeQOcfbUFSgWt64K2KKTFH7tv4kwokv73eRwWXL3JQAcJbvh1Xujnbr4XYqNx2%26wd%3D%26eqid%3Da9866a1600120faf00000004569f00b5&ecd=1&psr=1920x1200&par=1920x1160&pis=-1x-1&ccd=24&cja=true&cmi=6&col=zh-CN&cdo=-1&tcn=1453277693&sz=680x200&exps=110211&qn=0b5d5512643d1b84&tt=1453277692365.704.2129.2129&feid=110211" frameborder="0" marginwidth="0" marginheight="0" scrolling="no" align="center,center" width="680" height="200"></iframe>
一、结论
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默认的事务处理准确处理。
相关推荐
自己做的一个简单的spring运用实例,主要是关于事务回滚的一个小例子,希望对还在纠结事务回滚的童靴有点帮助。。。
Spring事务管理A方法内部调用B方法的回滚问题测试代码
花了一晚上时间终于搞出来了Spring整合Mybatis事务回滚(Mysql数据库),控制Service层中的多次插入操作,多次操作整体是一个事务。 里面有缘嘛和jar包,资源为war包,导入即可。运行Test类中的测试代码即可。 建表...
子线程任务发生异常,主线程事务如何回滚
1. 基于Aspectj实现动态数据源...6. 实现事务内切换数据源(支持原生Spring声明式事务哟,仅此一家),并支持多数据源事务回滚(有了它除了跨服务的事务你需要考虑分布式事务,其他都不需要,极大的减少了系统的复杂程度)
java 应用程序操作数据库实例,若出现sql异常则事务回滚。
Spring/SpringMVC/MyBatis整合,可事务回滚
基于SpringBoot的轻量级redis事务回滚机制,使用栈和ThreadLocal记录业务链的redis操作,发生异常进行回滚,参考了阿里巴巴Seata AT模式的db回滚策略:补偿回滚,记录前镜像与当前操作语句,反向解析生成补偿动作。...
主要介绍了spring事务异常回滚实例解析,具有一定借鉴价值,需要的朋友可以参考下
SQL 事务回滚解决回滚无效的情况 BEGIN TRY END TRY CAHTH
主要介绍了Spring异常捕获且回滚事务解决方案,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
oracle 在java中的事务处理和异常回滚。 里面的类直接运行,需要把oracle的数据库连接改改就ok、
oracle 事务 回滚 存储过程 自用
执行多条SQL语句对数据库进行操作,如果某个SQL语句执行中出错,那么要对之前的操作进行回滚,代码比较简单。
本例所有的事务放在service层进行管理,方法中间抛出运行时异常以测试是否回滚 Spring配置文件中关于事务配置总是由三个组成部分,分别是DataSource、TransactionManager和代理机制这三部分,无论哪种配置方式,...
spring boot 纯注解方法事务控制回滚,注解+简单配置文件使用多线程demo
集成了Spring 3.2.2 Hibernate 3.3.2 Struts 2.3.4 用JPA的注解实现orm 不用创建数据库表 只需本机上有oracle即可 用JSR注解进行Spring的...用Spring Test整合Junit4 进行测试并自动事务回滚 不对数据库造成持久化操作
Java-JDBC【之】事务介绍、事务特性、操作事务(事务提交、异常回滚) 1.数据库事务 1.1.介绍 1.2.事务特性(ACID) 1.3.隔离性(Isolation),带来的问题与处理 1.4.JDBC事务处理 2.事务提交(代码实现) 3.异常...
Spring中的JdbcTemplate,Spring中的的事务.。。。。。。。