Spring的7种事务传播行为

本文详细解释了七种事务传播行为,包括REQUIRED、SUPPORTS、MANDATORY等,以及REQUIRED_NEW和NESTED的区别,帮助理解事务方法在不同场景下的执行方式。


事务传播行为指的是一个事务方法被另一个事务方法调用时,这个事务方法应该如何进行。

比如说,有一个A方法,里面调用了B方法,当执行到B方法时,是应该在当前事务里执行,还是重新打开一个事务来执行,这是由B方法的事务传播行为决定的

七种事务传播行为

PROPAGATION_REQUIRED表明当前方法一定要在事务中执行,如果有事务存在,就在当前事务中执行;如果没有,则启动一个新的业务执行
PROPAGATION_SUPPORTS表明当前方法可以不在事务中执行,如果有事务存在,才会在事务中执行,否则就会以非事务的方式执行
PROPAGATION_MANDATORY表明当前方法一定要在事务中执行,如果不存在事务,就会抛出一个异常
PROPAGATION_REQUIRED_NEW表明当前方法必须运行在自己的事务中,如果当前事务存在的话,会将原来事务挂起,然后启动新事务来执行这个方法,方法执行完成后,才会将原来的事务恢复,原来的事务和新启动的事务是互不干扰的
PROPAGATION_NOT_SUPPORTED表明当前方法不在事务中运行,如果当前事务存在的话,会将原来事务挂起,然后以非事务的方式执行完当前方法,然后再恢复原有事务
PROPAGATION_NEVER表明当前方法不能运行在事务中,如果当前事务存在,则会抛出异常
PROPAGATION_NESTED表明嵌套事务,如果当前事务存在的话,会在事务内部开启一个事务,并且原来事务不会被挂起,也就是说,外部事务和内部事务是有关系的,外部事务的回滚会导致内部事务的回滚

主要就是PROPAGATION_REQUIRED_NEWPROPAGATION_NESTED的区别:

两者都是嵌套事务,区别就是,前者的外部事务和内部事务是不关联的,外部事务的无法回滚和提交内部事务,也就是说外部事务的执行成功与否不影响内部事务的回滚或提交;而后者的外部事务与内部事务是相关联的,外部事务的执行失败会导致内部事务的回滚

### Spring 框架中的七种事务传播行为Spring 中配置任何选定的事务策略时,都需要设置相应的事务管理器[^1]。Spring 提供了多种方式来控制事务行为,其中一项重要特性就是事务传播行为。以下是 Spring 支持的七种主要事务传播行为: #### 1. `PROPAGATION_REQUIRED` 这是默认选项。如果当前存在事务,则支持该事务;如果没有则创建一个新的事务。 ```java @Transactional(propagation = Propagation.REQUIRED) public void methodA() { // 方法体 } ``` #### 2. `PROPAGATION_SUPPORTS` 如果有现有事务就加入它,但如果不存在也不会启动新的事务。 ```java @Transactional(propagation = Propagation.SUPPORTS) public void methodB() { // 方法体 } ``` #### 3. `PROPAGATION_MANDATORY` 强制要求调用方已经开启了一个事务,否则抛出异常。 ```java @Transactional(propagation = Propagation.MANDATORY) public void methodC() { // 方法体 } ``` #### 4. `PROPAGATION_REQUIRES_NEW` 无论是否存在已有事务都会创建新事务,并暂停原有事务(若有)直到此方法完成。 ```java @Transactional(propagation = Propagation.REQUIRES_NEW) public void methodD() { // 方法体 } ``` #### 5. `PROPAGATION_NOT_SUPPORTED` 不运行在事务上下文中执行业务逻辑,如有活动事务会挂起。 ```java @Transactional(propagation = Propagation.NOT_SUPPORTED) public void methodE() { // 方法体 } ``` #### 6. `PROPAGATION_NEVER` 不允许有活跃的事务环境,在这种情况下如果检测到正在运行的事务就会报错。 ```java @Transactional(propagation = Propagation.NEVER) public void methodF() { // 方法体 } ``` #### 7. `PROPAGATION_NESTED` 类似于`REQUIRES_NEW`但是更轻量级的选择,可以理解为内部嵌套事务。当外部事务失败回滚时,内层事务也会一起被撤销。 ```java @Transactional(propagation = Propagation.NESTED) public void methodG() { // 方法体 } ``` 每一种传播属性都有其特定的应用场景,开发者应根据实际需求合理选用合适的事务传播机制以确保数据的一致性和可靠性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值