社区微信群开通啦,扫一扫抢先加入社区官方微信群
社区微信群
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的话,则上层方法的整个事务会被回滚。
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!