1、事务传播方式有哪几种?
@Transactional中的几种事务传播
- 1.REQUIRED 如果方法在运行的时候存在事务,已经存在了一个事务,那么会加入到该事务中,否则的话自己创建一个新的事务。 (spring的默认传播行为就是REQUIRED) 例子: ...
- 2.SUPPORTS 如果有事务就在事务的环境下执行,否则反之不在事务的环境下执行。 例子: ...
- 3.MANDATORY 当前的方法必须在事务中运行,否则的话就抛出异常。 例子: ...
- 4.REQUIRES_NEW 当前的方法必须在自己的事务内运行,如果有其他的事务就将它挂起。 例子: ...
- 5.NOT_SUPPORTED 当前的方法不会在事务中运行,如果有事务就会将它挂起。 例子: ...
- 6.NEVER 当前的方法如果在事务中运行,则抛出异常。 例子: ...
-
7.如果存在事务运行,那么这个方法就是在这个事务的嵌套事务内运行,嵌套事务是独立提交或回滚;
如果不存在事务,就按照REQUIRED执行;
如果主事务回滚,子事务一定会回滚;如果子事务回滚,主事务可以回滚,也可以不回滚。
2、事务嵌套会导致事务失效吗 ?举例说明
举例:两个均加了事务注解的方法A和B,在A方法中调用B方法,会导致B的事务不起作用,因为加了事务注解的方法,并不是本身在执行,而是 代理类在执行,而在A方法中调用B方法的时候,默认的是this.B();,代表并没有使用代理类来执行,所以不会享受代理的服务。
3、你知道哪些情况下事务会失效吗
1、同一个类中两个方法A和B,没有添加事务注解的方法A调用了添加事务的方法B,事务不会生效
2、方法不是public的:@ Transactional 只能用于public的方法上,否则事务失效
3、数据库不支持事务
4、没有被Spring管理(类上没有注释@Service等IOC注解)
5.在同一个类不要使用this.XX(方法),因为这个this并不是spring用cglib增强的类,没有被代理,那就没有事务