你的Spring事务为什么不会自动回滚? - Go语言中文社区

你的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的话,则上层方法的整个事务会被回滚。

 

 

版权声明:本文来源CSDN,感谢博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/qq_22075041/article/details/83352011
站方申明:本站部分内容来自社区用户分享,若涉及侵权,请联系站方删除。
  • 发表于 2020-03-07 21:02:12
  • 阅读 ( 892 )
  • 分类:

0 条评论

请先 登录 后评论

官方社群

GO教程

猜你喜欢