Spring事务传播机制

spring事务的传播机制:Spring在TransactionDefinition接口中规定了7种类型的事务传播行为,它们规定了
事务方法和事务方法发生嵌套调用时事务如何进行传播

定义两个类service1和service2,service1有方法method1,service2有方法method2,在method1中调用mehtod2

service1.method1 -> service2.method2

【REQUIRED】
service1:事务传播机制:REQUIRED,service2:REQUIRED
REQUIRED:支持事务,没有事务时创建新的事务,如果存在事务则直接加入该事务执行
method1执行时没有事务,则会新建事务Tx1,在method1中调用method2时,发现已经存在事务,则会加入事务执行,最后执行commit

【NOT_SUPPORTED】
service1:事务传播机制:NOT_SUPPORTED,service2:REQUIRED
NOT_SUPPORTED:以非事务方式执行,如果当前存在事务则将当前事务挂起
method1执行不会创建事务,执行method2时会创建新的事务,执行sql之后会进行commit

service1:事务传播机制:NOT_SUPPORTED,service2:NOT_SUPPORTED
两个方法都不会创建事务执行
NOT_SUPPORTED相当于没有Spring事务,每条执行语句单独执行,单独提交

【REQUIRES_NEW】
REQUIRES_NEW:不管是否存在事务,都创建一个新的事务,原来的方法挂起,新的方法执行完毕后,继续执行老的事务
service1:事务传播机制:REQUIRED,service2:REQUIRES_NEW
执行method1时会创建新的事务Tx1,执行method2时会先将Tx1挂起,然后创建新的事务Tx2,执行完后Tx2进行commit,然后将Tx1解除挂起,Tx1进行commit
REQUIRES_NEW为当前方法创建一个新的事务,并且当前事务先提交,然后再提交老的事务
【新的事务提交成功之后,老的事务提交失败时新的事务的sql不会回滚】
【新的事务提交失败回滚,老的事务是否会进行回滚?】应该会的


【MANDATORY】
必须在一个已有的事务中执行,否则报错
service1:事务传播机制:NOT_SUPPORTED,service2:MANDATORY
method1不会创建事务执行,method2执行时检查当前没有事务,则会抛出异常不会执行,method1已经在数据库层面执行成功并完成commit,所以抛出的异常不影响method1的执行结果
MANDATORY必须在已有事务下被调用,否则报错

【NEVER】
须在一个没有事务中执行,否则报错
service1:事务传播机制:REQUIRED,service2:NEVER
method1执行时没有事务,则会新建事务Tx1,method2执行时检查到存在事务,则会进行报错抛出异常,method1由于还没有提交事务,则会进行回滚

【SUPPORTS】
如果其他bean调用这个方法时,其他bean声明了事务,则就用这个事务,如果没有声明事务,那就不用事务
service1:事务传播机制:REQUIRED,service2:SUPPORTS
method1执行时没有事务,则会新建事务Tx1,method2执行时检查到存在事务,则在事务中进行执行,然后进行commit

service1:事务传播机制:NOT_SUPPORTED,service2:SUPPORTS
method1执行不会创建事务,method2也不会创建事务

SUPPORTS类型的事务传播机制,是否使用事务取决于调用方法是否有事务,如果有则直接用,如果没有则不使用事务

【NESTED】
如果当前存在事务,则在嵌套事务内执行。如果当前没有事务,则执行与REQUIRED类似的操作
service1:事务传播机制:REQUIRED,service2:NESTED
method1执行时没有事务,则会新建事务Tx1,执行sql后不会提交,method2创建一个NESTED嵌套事务执行sql,然后一起提交
method1方法创建一个事务,则再调用method2方法时,直接在该事务的基础上创建一个嵌套事务,本质上还是同一个事务,做一次提交;

service1:事务传播机制:NOT_SUPPORTED,service2:NESTED
method1执行不会创建事务,sql执行在数据库commit,method2会创建一个事务执行sql后commit
method1方法不创建事务,则调用method2方法时,直接创建一个新的事务,单独提交

1)REQUIRED

    当两个方法的传播机制都是REQUIRED时,如果一旦发生回滚,两个方法都会回滚
2)REQUIRES_NEW

    当method2方法传播机制为REQUIRES_NEW,会开启一个新的事务,并单独提交方法,所以method1方法的回滚并不影响dmethod2方法事务提交
3)NESTED

    当method1方法为REQUIRED,method2方法为NESTED时,method2方法开启一个嵌套事务;

    当method1方法回滚时,method2方法也会回滚;反之,如果method2方法回滚,则并不影响method1方法的提交

### Spring事务传播机制详解 在Spring框架中,事务传播机制用于定义多个事务方法相互调用时的事务边界管理方式。这种机制通过`@Transactional(propagation = Propagation.XXX)`注解进行配置,并依赖于数据库的“事务管理器”(如`DataSourceTransactionManager`)实现[^1]。 #### 事务传播机制的核心接口 Spring事务传播机制的基础是`PlatformTransactionManager`和`TransactionDefinition`两个核心接口: - `PlatformTransactionManager`:负责事务的获取、提交和回滚操作。 ```java public interface PlatformTransactionManager { TransactionStatus getTransaction(TransactionDefinition definition); void commit(TransactionStatus status); void rollback(TransactionStatus status); } ``` - `TransactionDefinition`:定义了事务的基本属性,包括传播行为、隔离级别、超时时间以及是否只读等。 ```java public interface TransactionDefinition { int getPropagationBehavior(); int getIsolationLevel(); int getTimeout(); boolean isReadOnly(); } ``` 这些接口共同构成了Spring事务管理的底层支持体系[^2]。 #### 七种事务传播行为及其特性 Spring提供了七种不同的事务传播行为,每种行为适用于特定的业务场景: 1. **PROPAGATION_REQUIRED** 支持当前事务,如果没有事务则创建一个新的事务。这是默认的传播行为,适用于大多数业务场景。 2. **PROPAGATION_SUPPORTS** 支持当前事务,如果没有事务则以非事务方式执行。适用于对事务要求不高的查询操作。 3. **PROPAGATION_MANDATORY** 必须存在当前事务,否则抛出异常。适用于强制要求事务上下文的操作。 4. **PROPAGATION_REQUIRES_NEW** 创建一个新的事务并挂起当前事务。适用于需要独立事务的操作,避免与外部事务产生影响。 5. **PROPAGATION_NOT_SUPPORTED** 以非事务方式执行,如果当前存在事务则将其挂起。适用于不需要事务支持的操作,例如日志记录。 6. **PROPAGATION_NEVER** 以非事务方式进行,如果存在事务则抛出异常。适用于明确禁止事务的场景。 7. **PROPAGATION_NESTED** 如果当前存在事务,则在嵌套事务内执行;如果当前没有事务,则创建一个新事务。适用于需要部分回滚的复杂事务场景[^4]。 #### 事务传播机制的重要性 Spring事务传播机制为复杂业务场景提供了灵活的事务管理能力。通过合理配置传播行为,可以有效控制事务边界,避免数据不一致问题,同时提高系统的性能和稳定性[^3]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值