ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

理解Spring的事务传播级别

2021-06-19 02:05:02  阅读:222  来源: 互联网

标签:事务 Spring 传播 PROPAGATION 执行 方法 级别


知乎看到的文章,讲的很详细,点击查看

学习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,传播,PROPAGATION,执行,方法,级别
来源: https://www.cnblogs.com/jadexu07/p/14901789.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有