事务的传播特性指的是当一个事务方法被另一个事务方法调用时,这个事务方法应该如何进行?
spring的事务传播行为一共有7种:默认传播属性是REQUIRED
假设1号事务去调用,2号事务和3号事务(2,3事务在同一个类当中)
**REQUIRED:如果当前没有事务,创建一个新的事务,如果有事务就加入到事务中**
当1号事务加了@Transactional,即使2号事务异常被捕获还是会进行回滚操作。
2号事务加了@Transactional(propagation = Propagation.REQUIRED) ,并且出现了异常,
3号事务加了@Transactional(propagation = Propagation.REQUIRED) ,没有异常,
3号事务会进行回滚操作。
**REQUIRES_NEW:无论当前存不存在事务,都创建一个新的事务执行**
当1号事务加了@Transactional,
2号事务加了@Transactional(propagation = Propagation.REQUIRES_NEW) ,并且出现了异常,
3号事务加了@Transactional(propagation = Propagation.REQUIRES_NEW),没有异常,
3号事务不会进行回滚操作。
当1号事务加了@Transactional,并捕获了2号事务的异常
2号事务加了@Transactional(propagation = Propagation.REQUIRES_NEW) ,并且出现了异常,
3号事务加了@Transactional,没有异常,
3号事务不会进行回滚操作。
当1号事务加了@Transactional,并且出现了异常
2号事务加了@Transactional(propagation = Propagation.REQUIRES_NEW) ,没有异常
3号事务加了@Transactional,没有异常,
2号事务不会进行回滚操作。
SUPPORTS:如果当前存在事务,就加入到改事务当中,如果不存在事务,就以非事务的方式运行
当2号事务加了@Transactional(propagation = Propagation.SUPPORTS)并且出现了异常。
而1号事务(主事务)没有加@Transactional,那么2号事务就不会进行回滚操作。
NOT_SUPPORTED:
当2号事务加了@Transactional(propagation = Propagation.NOT_SUPPORTS)出现异常。
1号事务(主事务)即使加了@Transactional,也不会进行回滚操作。
NEVER:当前的方法不应该运行在事务中(不能有@Transactional)如果有就会抛出异常。
MANDATORY:当前的方法必须运行在事务中(必须有@Transactional)否则就会抛出异常
NESTED:
当1号事务加了@Transactional,并把2号事务的异常捕获了
2号事务加了@Transactional(propagation = Propagation.NESTED),并且出现了异常,
3号事务加了@Transactional,没有异常,
3号事务不会进行回滚操作。(这和REQUIRED的区别)
当1号事务加了@Transactional,出现了异常
2号事务加了@Transactional(propagation = Propagation.NESTED),没有异常
3号事务加了@Transactional,没有异常,
2号事务会进行回滚操作。(这和REQUIRES_NEW的区别)
如果在bookservice执行的话,会发现刚刚的效果就没有了,原因是外层调用的时候使用的AOP,但是本类方法自己的调用就是最最普通的调用,就是同一个事务。