此文章是vip文章,如何查看?  

1,点击链接获取密钥 http://nicethemes.cn/product/view29882.html

2,在下方输入文章查看密钥即可立即查看当前vip文章


你的Spring事务为什么不会自动回滚?

  • 时间:
  • 浏览:
  • 来源:互联网

Spring的事务传播行为有七种,当前我说的是默认的那种。我们知道Spring的声明式事务是基于AOP的,那么就是AOP玩的又是代理对象,那你是不是就知道了,这个事务的大概实现原理了。。。

首先我们要明确RuntimeException与Exception之间的关系与他们分别的含义:

1.在Java中异常的基类为Throwable,他有两个子类Exception与Errors,同时RuntimeException就是Exception的子类;

2.RuntimeException,即运行时异常,为非受检(UNCHECKED)异常;      

3.Exception的其他子类异常,为非运行时异常,为受检异常(CHECKED)异常;

Spring事务回滚机制是这样的:当所拦截的方法有指定异常抛出,事务才会自动进行回滚!

     ①被拦截方法-—— 注解式:方法或者方法所在类被@Transactional注解;

     ②异常—— 该方法的执行过程必须出现异常,这样事务管理器才能被触发,并对此做出处理;

    ③指定异常—— 默认配置下,事务只会对Error与RuntimeException及其子类这些UNChecked异常,做出回滚。一般的Exception这些Checked异常不会发生回滚(如果一般Exception想回滚要做出配置);

RuntimeException所包含的子类具体有哪些:

 下面给出一些受检CHECKED异常:

提醒:执行方法的时候出现了SQL执行的Exception事务还是发生了回滚,是因为Spring框架下,所有SQL异常都被org.springframework重写为RuntimeException!

还有一点当这个方法上加了@Transaction(此处是默认的传播行为)注解,当这个方法抛出RuntimeException之后被try catch之后声明式事务是不会感知的,当然也不会回滚,但是当在另一个也有事务的方法内调用了这个方法,形成嵌套事务,这个方法抛出了RuntimeException之后在上层方法内try catch的话,则上层方法的整个事务会被回滚。

 

 

本文链接http://element-ui.cn/news/show-577331.aspx