理解Spring的事务传播级别
Posted JadeXu07
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了理解Spring的事务传播级别相关的知识,希望对你有一定的参考价值。
学习SpringCloudAlibaba的Seata分布式事务组件时,了解到spring事务具有传播性,就去学习了下。
以下是我自己的理解,就是还没有做总结。
注解:@Transactional(propagation=传播级别)
1、PROPAGATION_REQUIRED(翻译就是需要传播):spring默认的事务传播级别,就是当上下文存在一个事务,就加入该事务,如果没有就新建事务。
举例:在一个服务里有两个方法A、B,都是默认的事务传播级别,A里调用了B,执行A时就开启了一个事务,当执行到调用方法B时,因为此时已经存在了一个事务,那么B就不开启新事务,而是加入到已经存在的那个事务里。如果执行B的时候出异常,那么不仅B方法里执行的会被回滚,A也会全回滚。
2、PROPAGATION_REQUIRED_NEW(翻译就是需要传播新的,我乱翻的):当前的方法必须启动新的事务,并且在它自己的事务内运行,不管此时上下文是否存在事务,都要开启。
举例:在一个服务里有两个方法A、B,方法A是默认的事务传播级别,方法B是PROPAGATION_REQUIRED_NEW级别,A里调用了B,执行A的时候,就开启了一个事务,当执行到B方法的时候,因为B的传播级别,所以B不管此时是否已经有一个事务存在,它都会启动自己的事务。当B抛出异常,B自己回滚,A不受影响并继续执行,当A出异常,A自己回滚,B不受影响。说白了就是,各自提交或者回滚各自的事务,相互之间不会造成影响。
3、PROPAGATION_SUPPORTS(翻译就是支持传播):如果上下文已存在事务,则加入该事务,如果不存在,就不开启新的事务,以非事务的方式执行。
举例:在一个服务里有两个方法A、B,方法A是默认的事务传播级别,方法B是PROPAGATION_SUPPORTS级别,A里调用了B,执行A的时候,就开启了一个事务,此时和PROPAGATION_REQUIRED是一样的,B会加入到这个事务。区别就在于如果是单独执行B方法,此时上下文没有事务,它并不会开启新事务,而是以非事务的方式执行。
4、 PORPAGATION_NOT_SUPPORTED(翻译就是不支持传播):就是当前方法不能在事务里执行,如果上下文存在了事务,就先把这个事务挂起,当前方法以非事务方式执行,执行完后再继续这个事务。
举例:在一个服务里有两个方法A、B,方法A是默认的事务传播级别,方法B是PROPAGATION_NOT_SUPPORTED级别,A里调用了B,执行A的时候,就开启了一个事务,当调用B的时候,会被这个事务先挂起,B以非事务的方式执行,执行完后事务再继续执行。此时不管B是成功还是失败,对A都不造成影响。此时如果A出现异常,对B也不会造成影响,只会回滚A里的其他的执行。如果是单独执行B方法,直接会以非事务的方式执行。
5、 PROPAGATION_MANDATORY(翻译就是强制传播):如果上下文已存在事务,则加入该事务,如果不存在,就抛出异常,即必须在事务的环境下运行。
举例:在一个服务里有两个方法A、B,方法A是默认的事务传播级别,方法B是PROPAGATION_MANDATORY级别,A里调用了B,执行A的时候,就开启了一个事务,此时和PROPAGATION_REQUIRED是一样的,B会加入到这个事务。区别就在于如果是单独执行B方法,此时上下文没有事务,它并不会开启新事务,也不会以非事务的方式执行,而是抛出异常。
6、PROPAGATION_NEVER(翻译就是永无传播):如果上下文已存在事务,则抛出异常。如果没有则以非事务的方式执行。即不能在事务的环境下运行。
举例:在一个服务里有两个方法A、B,方法A是默认的事务传播级别,方法B是PROPAGATION_NEVER级别,A里调用了B,执行A的时候,就开启了一个事务,此时调用B,会抛出异常。如果是单独执行B方法,直接以非事务的方式执行。
7、PROPAGATION_NESTED(翻译就是嵌套传播):如果执行某方法时上下文已存在事务,则加入这个事务,但是会在执行方法前先创建一个回滚点(savepoint),如果这个方法失败则回滚到回滚点,成功后继续执行事务,如果此时出现异常,则事务全部回滚。如果上下文不存在事务,则开启一个新事务。
举例:在一个服务里有两个方法A、B,方法A是默认的事务传播级别,方法B是PROPAGATION_NESTED级别,A里调用了B,执行A的时候,就开启了一个事务,此时调用B,B会加入到这个事务,但是在B前会先创建一个回滚点,再执行B,执行B的时候如果出现异常,则回滚到回滚点,B执行完后继续执行,此时如果出现异常,事务则会全部回滚。
如果是单独执行B方法,则开启一个新的事务。
以上是关于理解Spring的事务传播级别的主要内容,如果未能解决你的问题,请参考以下文章