您的位置:

深入浅出Spring事务传播机制

一、事务概念

事务是指作为单个逻辑工作单元执行的一系列操作,所有操作要么全部成功完成,要么全部失败而回滚。在关系型数据库中,事务通常是指一系列的数据操作,比如增删改查等。

二、Spring事务管理器

Spring事务管理器是Spring框架提供的一个事务管理的通用接口。Spring事务管理器可以与多种事务管理机制进行集成,包括JDBC事务、JTA事务和Hibernate事务等。

@Configuration
@EnableTransactionManagement
public class AppConfig {
    @Bean
    public DataSource dataSource() {
        // 创建数据源
    }

    @Bean
    public PlatformTransactionManager transactionManager() {
        return new DataSourceTransactionManager(dataSource());
    }
}

三、Spring事务传播机制

Spring事务传播机制是指在多个事务方法调用的嵌套情况下,事务如何进行传播。

1、REQUIRED

REQUIRED是Spring默认的事务传播机制。该机制会在当前事务不存在时,创建一个新的事务并在当前事务中执行。在当前事务中调用其他方法时,调用的方法将在当前事务中执行。

@Transactional(propagation = Propagation.REQUIRED)
public void methodA() {
    // do something
    methodB();
}

@Transactional(propagation = Propagation.REQUIRED)
public void methodB() {
    // do something
}

2、SUPPORTS

SUPPORTS是指当前调用方法如果已经在事务中,则直接加入该事务,否则以非事务的方式执行。如果调用的方法没有事务,则当前方法也不会创建事务,以非事务的方式执行。

@Transactional(propagation = Propagation.SUPPORTS)
public void methodA() {
    // do something
    methodB();
}

@Transactional(propagation = Propagation.SUPPORTS)
public void methodB() {
    // do something
}

3、MANDATORY

MANDATORY是指当前调用方法必须在一个事务中运行,否则将抛出异常。

@Transactional(propagation = Propagation.MANDATORY)
public void methodA() {
    // do something
    methodB();
}

@Transactional(propagation = Propagation.MANDATORY)
public void methodB() {
    // do something
}

4、REQUIRES_NEW

REQUIRES_NEW是指当前调用方法必须启动一个新的事务,并在该事务中运行。如果当前存在事务,则将当前事务挂起并创建一个新的事务执行。

@Transactional(propagation = Propagation.REQUIRES_NEW)
public void methodA() {
    // do something
    methodB();
}

@Transactional(propagation = Propagation.REQUIRES_NEW)
public void methodB() {
    // do something
}

5、NOT_SUPPORTED

NOT_SUPPORTED是指当前调用方法不应该在事务中运行。如果当前存在事务,则将该事务挂起并以非事务的方式执行该方法。

@Transactional(propagation = Propagation.NOT_SUPPORTED)
public void methodA() {
    // do something
    methodB();
}

@Transactional(propagation = Propagation.NOT_SUPPORTED)
public void methodB() {
    // do something
}

6、NEVER

NEVER是指当前调用方法不应该在事务中运行。如果当前存在事务,则抛出异常。

@Transactional(propagation = Propagation.NEVER)
public void methodA() {
    // do something
    methodB();
}

@Transactional(propagation = Propagation.NEVER)
public void methodB() {
    // do something
}

7、NESTED

NESTED是指当前调用方法应该在一个嵌套事务中执行。如果当前不存在事务,则与REQUIRED传播机制相同。如果当前存在事务,则在该事务的嵌套事务中执行。

@Transactional(propagation = Propagation.NESTED)
public void methodA() {
    // do something
    methodB();
}

@Transactional(propagation = Propagation.NESTED)
public void methodB() {
    // do something
}

四、总结

Spring事务传播机制是Spring框架重要的一部分。在实际开发中,应该根据实际情况选择合适的事务传播机制,以保证事务的正确性和完整性。