Spring事务回滚策略

来源:互联网 发布:做美工需要学什么 编辑:程序博客网 时间:2024/06/07 14:07

原文地址:http://blog.csdn.net/super_man_x/article/details/50886919

spring的事务管理默认只对出现运行期异常(Java.lang.RuntimeException及其子类)进行回滚。

如果一个方法抛出Exception或者Checked异常,Spring事务管理默认不进行回滚。 

Throwable分为Error和Exception(RuntimeException) 
Throwable是所有异常的根,java.lang.Throwable 
Error是错误,java.lang.Error 
Exception是异常,java.lang.Exception

  • Exception 
    一般分为Checked异常和Runtime异常,所有RuntimeException类及其子类的实例被称为Runtime异常,不属于该范畴的异常则被称为CheckedException。  
    Checked异常 
    只有java语言提供了Checked异常,Java认为Checked异常都是可以被处理的异常,所以Java程序必须显示处理Checked异常。如果程序没有处理Checked异常,该程序在编译时就会发生错误无法编译。这体现了Java的设计哲学:没有完善错误处理的代码根本没有机会被执行。对Checked异常处理方法有两种  
    (1) 当前方法知道如何处理该异常,则用try…catch块来处理该异常。  
    (2) 当前方法不知道如何处理,则在定义该方法是声明抛出该异常。  
    我们比较熟悉的Checked异常有  
    Java.lang.ClassNotFoundException  
    Java.lang.NoSuchMetodException  
    java.io.IOException  
    RuntimeException 
    Runtime如除数是0和数组下标越界等,其产生频繁,处理麻烦,若显示申明或者捕获将会对程序的可读性和运行效率影响很大。所以由系统自动检测并将它们交给缺省的异常处理程序。当然如果你有处理要求也可以显示捕获它们。 
<span class="hljs-keyword" style="display: block; padding: 0px; box-sizing: border-box; border-top-left-radius: 0px; border-top-right-radius: 0px; border-bottom-right-radius: 0px; border-bottom-left-radius: 0px; word-wrap: normal;">package <span style="font-family: Arial, Helvetica, sans-serif;">com.YouXu.view;</span></span><span style="display: block; box-sizing: border-box; border-top-left-radius: 0px; border-top-right-radius: 0px; border-bottom-right-radius: 0px; border-bottom-left-radius: 0px; word-wrap: normal;"></span><span class="hljs-keyword" style="box-sizing: border-box;">import</span> org.junit.Test;<span class="hljs-javadoc" style="box-sizing: border-box;">/** *  *<span class="hljs-javadoctag" style="box-sizing: border-box;"> @Title</span>: RuntimeExcetionMethods.java *<span class="hljs-javadoctag" style="box-sizing: border-box;"> @Package</span>: com.YouXu.view *<span class="hljs-javadoctag" style="box-sizing: border-box;"> @Copyright</span>: Copyright (c) 2015 *<span class="hljs-javadoctag" style="box-sizing: border-box;"> @author</span> you.xu *<span class="hljs-javadoctag" style="box-sizing: border-box;"> @date</span> 2016年3月14日下午3:37:51 *<span class="hljs-javadoctag" style="box-sizing: border-box;"> @version</span> 1.0 */</span><span class="hljs-keyword" style="box-sizing: border-box;">public</span> <span class="hljs-class" style="box-sizing: border-box;"><span class="hljs-keyword" style="box-sizing: border-box;">class</span> <span class="hljs-title" style="box-sizing: border-box;">RuntimeExcetionMethods</span> {</span>    <span class="hljs-keyword" style="box-sizing: border-box;">public</span> <span class="hljs-keyword" style="box-sizing: border-box;">void</span> <span class="hljs-title" style="box-sizing: border-box;">method1</span>() <span class="hljs-keyword" style="box-sizing: border-box;">throws</span> RuntimeException {        System.out.println(<span class="hljs-string" style="box-sizing: border-box;">"我是抛出运行时异常的方法"</span>);    }    <span class="hljs-annotation" style="box-sizing: border-box;">@Test</span>    <span class="hljs-keyword" style="box-sizing: border-box;">public</span> <span class="hljs-keyword" style="box-sizing: border-box;">void</span> <span class="hljs-title" style="box-sizing: border-box;">testMethod1_01</span>() {        method1();    }    <span class="hljs-annotation" style="box-sizing: border-box;">@Test</span>    <span class="hljs-keyword" style="box-sizing: border-box;">public</span> <span class="hljs-keyword" style="box-sizing: border-box;">void</span> <span class="hljs-title" style="box-sizing: border-box;">testMethod1_02</span>() {        <span class="hljs-keyword" style="box-sizing: border-box;">throw</span> <span class="hljs-keyword" style="box-sizing: border-box;">new</span> RuntimeException();    }}<ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right;"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li><li style="box-sizing: border-box; padding: 0px 5px;">12</li><li style="box-sizing: border-box; padding: 0px 5px;">13</li><li style="box-sizing: border-box; padding: 0px 5px;">14</li><li style="box-sizing: border-box; padding: 0px 5px;">15</li><li style="box-sizing: border-box; padding: 0px 5px;">16</li><li style="box-sizing: border-box; padding: 0px 5px;">17</li><li style="box-sizing: border-box; padding: 0px 5px;">18</li><li style="box-sizing: border-box; padding: 0px 5px;">19</li><li style="box-sizing: border-box; padding: 0px 5px;">20</li><li style="box-sizing: border-box; padding: 0px 5px;">21</li><li style="box-sizing: border-box; padding: 0px 5px;">22</li><li style="box-sizing: border-box; padding: 0px 5px;">23</li><li style="box-sizing: border-box; padding: 0px 5px;">24</li><li style="box-sizing: border-box; padding: 0px 5px;">25</li><li style="box-sizing: border-box; padding: 0px 5px;">26</li><li style="box-sizing: border-box; padding: 0px 5px;">27</li><li style="box-sizing: border-box; padding: 0px 5px;">28</li><li style="box-sizing: border-box; padding: 0px 5px;">29</li></ul><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right;"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li><li style="box-sizing: border-box; padding: 0px 5px;">12</li><li style="box-sizing: border-box; padding: 0px 5px;">13</li><li style="box-sizing: border-box; padding: 0px 5px;">14</li><li style="box-sizing: border-box; padding: 0px 5px;">15</li><li style="box-sizing: border-box; padding: 0px 5px;">16</li><li style="box-sizing: border-box; padding: 0px 5px;">17</li><li style="box-sizing: border-box; padding: 0px 5px;">18</li><li style="box-sizing: border-box; padding: 0px 5px;">19</li><li style="box-sizing: border-box; padding: 0px 5px;">20</li><li style="box-sizing: border-box; padding: 0px 5px;">21</li><li style="box-sizing: border-box; padding: 0px 5px;">22</li><li style="box-sizing: border-box; padding: 0px 5px;">23</li><li style="box-sizing: border-box; padding: 0px 5px;">24</li><li style="box-sizing: border-box; padding: 0px 5px;">25</li><li style="box-sizing: border-box; padding: 0px 5px;">26</li><li style="box-sizing: border-box; padding: 0px 5px;">27</li><li style="box-sizing: border-box; padding: 0px 5px;">28</li><li style="box-sizing: border-box; padding: 0px 5px;">29</li></ul>

我们比较熟悉的RumtimeException类的子类有  
Java.lang.ArithmeticException  
Java.lang.ArrayStoreExcetpion  
Java.lang.ClassCastException  
Java.lang.IndexOutOfBoundsException  
Java.lang.NullPointerException 

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

0 0
原创粉丝点击