Spring事务传播机制

2023-05-11 10:34:57 浏览数 (1)

事务的概念

事务是指一组操作,这些操作要么全部执行成功,要么全部失败回滚。在数据库中,事务是指一组 SQL 语句,这些语句要么全部执行成功,要么全部失败回滚。

Spring 事务的概念

Spring 事务是指在 Spring 框架中对事务进行管理的机制。Spring 事务管理器可以管理多种事务,包括 JDBC、Hibernate、JPA、JTA 等。

Spring 事务具有以下特性:

  • 原子性:事务中的所有操作要么全部成功,要么全部失败回滚。
  • 一致性:事务执行前后,数据保持一致性。
  • 隔离性:事务之间互相隔离,不会相互影响。
  • 持久性:事务提交后,数据持久化到数据库中,不会因为系统故障而丢失。

手动声明式事务回滚伪代码

代码语言:javascript复制
    // 注入一个事务管理器
    @Autowired
    private PlatformTransactionManager transactionManager;

    @Override
    public String saveUser() {
        // 定义一个默认是事务传播方式:如果没有事务,就开启一个事务使用。如调用方有事务,则使用调用方的事务
        DefaultTransactionDefinition definition = new DefaultTransactionDefinition(TransactionDefinition.PROPAGATION_REQUIRED);
        // 开启事务
        TransactionStatus transaction = this.transactionManager.getTransaction(definition);
        try {
            // todo 业务
            this.transactionManager.commit(transaction); // 提交事务
        } catch (Exception e) {
            transactionManager.rollback(transaction); // 回滚业务 方式1
            // TransactionAspectSupport.currentTransactionStatus().setRollbackOnly(); // 回滚业务方式2 
            log.error("【业务失败】:触发回滚!");
        }
    }

事务的传播机制

使用方式:

代码语言:javascript复制
@Transactional(propagation = Propagation.REQUIRED)
代码语言:javascript复制
TransactionDefinition.PROPAGATION_REQUIRED
【白话】:默认的事务传播机制。只有被调用,就开一个新的事务。 90%的业务都用这个。

TransactionDefinition.PROPAGATION_SUPPORTS
【白话】:如有被调用者具有事务,则本方法加入(被调用者)父事务,如果被调用者没事务,则本方法以无事务(事务裸奔)运行。

TransactionDefinition.PROPAGATION_MANDATORY
【白话】:本方法调用者必须有事务,并加入到父事务中。如果调用者没事务,则抛出IllegalTransactionStateException异常。

TransactionDefinition.PROPAGATION_REQUIRES_NEW
【白话】:本方法开启一个新的的事务,如果父事务过程中遇到异常,与子事务无关。

TransactionDefinition.PROPAGATION_NOT_SUPPORTED
【白话】:如果调用者有事务,先挂机事务,本方法不使用任何事物执行。

TransactionDefinition.PROPAGATION_NEVER
【白话】:如果调用者有事务,本方法抛出IllegalTransactionStateException异常。就是不能在事务中运行。

TransactionDefinition.PROPAGATION_NESTED
【白话】:所有的事务,交给调用者处理。

事务的隔离级别

事务的超时时间

Spring 事务的常用 API 包括以下几种

  • PlatformTransactionManager:事务管理器接口。
  • TransactionDefinition:事务定义接口,定义事务的隔离级别、超时时间等。
  • TransactionStatus:事务状态接口,表示事务的状态。

0 人点赞