Spring事务传播性

所谓的Spring事务传播性是指:当多个含有事务的方法嵌套调用时,这些方法处理事务的规则。比如,当事务方法A调用事务方法B时,内层事务方法B会合并到外层调用者A方法的事务中,还是会新开启自己的事务。另外如果合并到外层事务,那么当内层方法回滚后,外层方法会不会回滚,这些都是由Spring事务传播性规则决定的。
Spring事务传播性处理这种嵌套事务的行为一共定义了7种处理方式:

  • PROPAGATION_REQUIRED
  • PROPAGATION_REQUIRED_NEW
  • PROPAGATION_SUPPORT
  • PROPAGATION_NOT_SUPPORT
  • PROPAGATION_NEVER
  • PROPAGATION_MANDATORY
  • PROPAGATION_NESTED
1. PROPAGATION_REQUIR

这个是Spring默认的事务传播行为,它指的是如果外层调用方法已经开启了事务,那么当前方法就加入到外层事务。如果外层调用方没有开启事务,那么当前方法就开启一个事务。
这种行为可以保证多个嵌套的事务方法在同一个事务内执行,可以保证多个事务同时提交或者同时回滚。这个机制可以满足大多数业务场景。
如果内层方法在执行时抛出了Exception异常,或者是在外层方法中使用try-catch语句catch了这个异常,并没有向外抛出,那么内层事务和外层事务都会回滚。因为两个方法在一个事务内,事物本身具有原子性,所以只要一个事务方法回滚,另一个也会回滚。

2. PROPAGATION_REQUIR_NEW

这个传播行为是每次都开启一个事务。如果外层调用方法已经开启了事务,就先把外层事务挂起,然后执行当前新事务,执行完毕后再恢复上层事务的执行。
这种行为如果内层方法抛出了Exception异常会回滚当前事务,但是不会影响外层方法的执行。

3. PROPAGATION_SUPPORT

这个传播行为是指,如果外层方法开启了事务,那么当前方法加入到外层事务,如果外层方法没有开启事务,那么当前方法也不会创建事务,直接使用非事务方式执行。

4. PROPAGATION_NOT_SUPPORT

这个传播行为不支持事务,也就是说如果外层方法开启了事务,就挂起事务,然后以非事务方式执行当前方法,等执行结束后再恢复外层事务的执行。

5. PROPAGATION_NEVER

这个传播行为不支持事务,也就是说如果外层方法开启了事务,就执行当前方法前会抛出异常。

IllegalTransactionStateException(
                    "Existing transaction found for transaction marked with propagation 'never'")
6. PROPAGATION_MANDATORY

这个传播行为是指配置了这个传播行为的方法只能在已经存在事务的方法中被调用,如果外层调用方法不存在事务,则会抛出异常。

IllegalTransactionStateException(
                    "No existing transaction found for transaction marked with propagation 'mandatory'")
7. PROPAGATION_NESTED

这个传播行为是指当外层调用方法存在事务时,当前方法合并到外层事务,如果外层方法没有开启事务,就当前开启事务。这点和PROPAGATION_REQUIR传播性一致。不同的是,该传播行为可以保存状态保存点,当事务回滚时,可以回滚到某一个保存点上,而不是回滚所有事务。

总的来说,在日常开发环境中,我们最常用到的事务传播行为只有两种,一是REQUIRED,二是 REQUIRES_NEW。其他的作为扩充了解一下就可以了。

你可能感兴趣的:(Spring事务传播性)