Spring事务传播性
Posted 红颜莫知己
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Spring事务传播性相关的知识,希望对你有一定的参考价值。
- 所谓的事务传播性是指:当多个含有事务方法嵌套调用时,这些方法处理事务的规则
比如:当事务方法A调用事务方法B时,内层事务方法B会合并到外层调用者A方法的事务中,还是会新开起自己的事务。另外如果合并到外层事务,那么内层事务回滚后,外层方法会不会回滚,这些就是由spring事务传播性规则控制的。
Spring事务传播性处理这种嵌套事务的行为一共定义了7种处理方式:
- PROPAGATION_REQUIRED:如果不存在外层事务,就主动创建事务;否则使用外层事务
- PROPAGATION_SUPPORTS:如果不存在外层事务,就不开启事务;否则使用外层事务
- PROPAGATION_MANDATORY:如果不存在外层事务,就抛出异常;否则使用外层事务
- PROPAGATION_REQUIRES_NEW:总是主动开启事务;如果存在外层事务,就将外层事务挂起
- PROPAGATION_NOT_SUPPORTED:总是不开启事务;如果存在外层事务,就将外层事务挂起
- PROPAGATION_NEVER:总是不开启事务;如果存在外层事务,则抛出异常
- PROPAGATION_NESTED:如果不存在外层事务,就主动创建事务;否则创建嵌套的子事务
1.PROPAGATION_REQUIRED
这个是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事务传播性的主要内容,如果未能解决你的问题,请参考以下文章