事务的传播行为:
- PROPAGATION_REQUIRED
在A方法开启事务调用b方法, 假如b方法事务配置用的是PROPAGATION_REQUIRED 那么b方法就不会开启新的事务, 会使用A的事务, 假如b出错, 那么A也要回滚 - PROPAGATION_REQUIRES_NEW
如果是c方法这种 ,使用PROPAGATION_REQUIRES_NEW来修饰@Transactional注解, 则在调用c方法后c的c方法会新创建一个事务, c方法出异常那么c回滚,A方法捕捉到c事务的异常后,可以选择回滚或者不会滚 - PROPAGATION_SUPPORTS
假设当前在事务中。即以事务的形式执行。假设当前不在一个事务中,那么就以非事务的形式执行 - PROPAGATION_MANDATORY
必须在一个事务中执行。也就是说,他仅仅能被一个父事务调用。否则,他就要抛出异常
本地事务失效问题
在一个类的内部, a,b,c三个方法都是加了@Transcational注解的方法, 在b和c上面还有一些事务的配置, 如果a直接调用b方法和c方法, 那么bc两个方法上面的事务配置会失效, 统一使用a事务的配置, 这是因为,@Transcational注解的事务是基于代理对象来实现的, 而直接调用,相当于在a的代理对象内调用了,绕过了b方法和c方法的代理对象, 代理对象是要在代理对象内实现对方法的增强, 而直接调动是没有增强的.
解决办法: 在a内部使用代理对象来调用b和c方法, 具体做法:
1.引入aspectj
2.加上@enableAspectjAutoProxy(exposeProxy=true)注解, 并且暴露代理对象
使用Aopcontext获取代理对象