一、spring中的事务
1、什么情况下会触发spring事务回滚
方法发生异常就会触发事务管理,在spring中想进行事务回滚必须加上@Transactional注解,下边是出现异常进行捕获进行回滚的源代码
2、如果事务方法抛出IOException会进行事务回滚吗
或者简单一点可以rollbackFor=Exception或者Throwable,这样不管发生哪一类异常就都可以进行捕获了
3、什么情况下spring事务会失效
a方法有事务,有事务出现异常肯定进行回滚如下:
b方法没有事务注解,没有事务,出现异常不会进行回滚。如下:
这种情况下发生异常不会进行回滚,事务没有生效
咱们就看入口,方法2是入口,由于没有加事务注解,所以方法本身没有开启事务,所以就不存在AOP拦截,就不会有事务,方法1虽然有事务,但是不是入口,所以事务失效。
这个时候事务是生效的
代码如下:
如果a方法发生了异常,那么是进行事务回滚的,调用另外一个bean的a方法又是一个入口,由于这个方法开启了事务,所以有AOP拦截,会生成一个代理对象,调用的是代理对象的a方法。
只有public方法加了事务注解是生效的,看源码就知道了,如下:
新的线程发生异常了,方法加了事务注解,不会进行回滚。只对当前线程中的异常进行回滚,开启新的线程中发生异常,是不进行回滚的。
异常被catch 了,不会进行回滚。
抛出的不是runtimeException,异常类型不匹配,不能进行回滚
事务都不在spring容器中肯定不能进行回滚
传播类型选择的本来就不支持事务,肯定就不能回滚了,比如NOT_SUPPORTED、NEVER