Spring事务的传播行为

什么是Spring事务的传播行为

Spring 框架中的事务传播行为用来描述在一个方法调用另一个带有事务性的方法时,该事务如何传播。

Spring 框架提供了七种事务传播行为

来,学个单词propagation--传播

Spring事务的传播行为_第1张图片

  1. PROPAGATION_REQUIRED(默认):如果当前没有事务在运行,则创建一个新事务;如果已有事务在运行,则加入该事务。
  2. PROPAGATION_SUPPORTS:如果当前有事务在运行,则入该事务;否以非事务方式运行。
  3. PROPAGATION_MANDATORY:必须有事务在运行;否则抛出异常。
  4. PROPAGATION_REQUIRES_NEW:总是开启一个新的事务。如果一个事务已经存在,则将这个存在的事务挂起。
  5. PROPAGATION_NOT_SUPPORTED:每次以非事务方式运行,如果当前有事务在运行,则将其挂起。
  6. PROPAGATION_NEVER:每次以非事务方式运行,如果当前有事务在运行,则抛出异常。
  7. PROPAGATION_NESTED:在当前事务中嵌套一个新事务。如果没有事务在运行,则创建一个新事务。如果已有事务在运行,则在该事务内嵌套一个新事务。

怎么使用呢?

在 Spring 中设置事务传播行为是通过注解或编程方式实现的。

注解方式:

在需要使用事务的方法上加上 `@Transactional 注解,并指定传播行为即可,例如:

@Transactional(propagation = Propagation.REQUIRED)
public void method() {
    // 方法逻辑...
}

编程方式:

可以在代码中使用 TransactionTemplate 或者直接通过 PlatformTransactionManager 来设置事务传播行为,例如:

// TransactionTemplate 方式
@Autowired
private PlatformTransactionManager transactionManager;

public void method() {
    TransactionTemplate template = new TransactionTemplate(transactionManager);
    template.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRED);
    template.execute(status -> { 
        // 方法逻辑...
        return null;
    });
}
    
// PlatformTransactionManager 方式
@Autowired
private PlatformTransactionManager transactionManager;

public void method() {
    DefaultTransactionDefinition def = new DefaultTransactionDefinition();
    def.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRED);
    TransactionStatus status = transactionManager.getTransaction(def);
    try {
        // 方法逻辑...
        transactionManager.commit(status);
    } catch (Exception ex) {
        transactionManager.rollback(status);
        throw ex;
    }
}

Spring事务注解失效的场景

1. 数据库引擎不支持事务(innoDB支持事务 )

2. 没有被Spring管理

3. 方法不是public的

4. 自身调用问题

5. 数据源未配置事务管理

6. 传播行为中设置了不支持事务

7. 异常被捕获掉

8. 异常类型错误, 默认捕获RuntimeException异常

最后咱们浅看一下源码

这是 Spring 命令式事务基础架构中的中央接口。应用程序可以直接使用它,但它主要不是作为 API:通常,应用程序将使用事务模板或通过 AOP 进行声明性事务划分。

public interface PlatformTransactionManager extends TransactionManager {
	//根据指定的传播行为返回当前活动的事务或创建新事务。
    TransactionStatus getTransaction(@Nullable TransactionDefinition definition)
    throws TransactionException;

	//提交给定的事务,关于其状态。如果事务已以编程方式标记为仅回滚,请执行回滚。
    void commit(TransactionStatus status) throws TransactionException;

	//执行给定事务的回滚。
    void rollback(TransactionStatus status) throws TransactionException;

}

这个接口提供了三个方法或者说是标准:

  1. 获取事务
  2. 提交事务
  3. 回滚事务

而他的实现类也必定重写了这些方法,太多了有兴趣自己瞅瞅

Spring事务的传播行为_第2张图片

如有错误,还请指正~

你可能感兴趣的:(Spring,spring,java,mybatis)