Spring Boot原理分析(四):声明式事务

文章目录

  • 一、Spring事务管理方式及其实现
    • 1. 编程式事务管理
    • 2. 声明式事务管理
  • 二、@Transactional详解
    • 1. 属性:事务传播行为(Propagation)
    • 2. 属性:事务隔离级别(Isolation)
    • 3. 属性:事务超时时间(timeout)
    • 4. 属性:只读属性(readOnly)
    • 5. 属性:回滚规则(rollbackFor、noRollbackFor、rollbackForClassName、noRollbackForClassName)

一、Spring事务管理方式及其实现

Spring 提供了多种管理事务的方式,包括编程式事务管理和声明式事务管理两种方式。下面分别介绍这两种方式及其实现方式:

1. 编程式事务管理

编程式事务管理是通过编写代码来手动管理事务。它需要在事务的开始和结束时,通过编程方式来控制事务的提交和回滚。Spring 提供了 PlatformTransactionManager 接口来实现编程式事务管理。通过该接口,我们可以手动管理事务的开始、提交和回滚等操作。

以下是一个简单的编程式事务管理的示例代码:

@Autowired
private PlatformTransactionManager transactionManager;

public void transferMoney(Account fromAccount, Account toAccount, BigDecimal amount) {
    TransactionStatus status = transactionManager.getTransaction(new DefaultTransactionDefinition());
    try {
        fromAccount.withdraw(amount);
        toAccount.deposit(amount);
        transactionManager.commit(status);
    } catch (Exception e) {
        transactionManager.rollback(status);
        throw e;
    }
}

在上述示例中,我们使用 PlatformTransactionManager 接口实现了编程式事务管理。在 transferMoney() 方法中,我们手动管理了事务的开始、提交和回滚等操作。

2. 声明式事务管理

Spring 提供了多种声明式事务管理的方式,包括基于 XML 配置文件、基于注解和基于 Java 配置类等方式。

Spring 基于注解的声明式事务实现,可以通过在方法上添加事务注解来指定事务的属性和行为。Spring 提供了多个事务注解,包括 @Transactional@Rollback@Commit 等。其中,@Transactional 注解是最常用的事务注解,用于标识需要进行事务管理的方法。

以下是一个基于注解的声明式事务实现的示例代码:

    @Transactional(propagation = Propagation.REQUIRED, isolation = Isolation.DEFAULT, rollbackFor = Exception.class)
    public void transferMoney(Account fromAccount, Account toAccount, BigDecimal amount) {
        fromAccount.withdraw(amount);
        toAccount.deposit(amount);
        accountDao.update(fromAccount);
        accountDao.update(toAccount);
    }

基于注解的声明式事务实现可以更加方便地管理事务,避免了手动管理事务的繁琐和出错的可能性。同时,它也提高了代码的可读性和可维护性。

总之,Spring 提供了多种管理事务的方式,包括编程式事务管理和声明式事务管理两种方式。编程式事务管理需要手动管理事务的开始、提交和回滚等操作,而声明式事务管理则是通过在配置文件中声明事务规则,来自动管理事务。通过选择适合自己的方式,可以更加方便地实现事务管理。

二、@Transactional详解

@Transactional 是 Spring Framework 中最常用的事务注解之一,它可以用来标识需要进行事务管理的方法或类。@Transactional 注解可以指定事务的传播行为、隔离级别、超时时间、只读属性、回滚规则等属性。以下是对 @Transactional 注解的详细解析:

 @Transactional(propagation = Propagation.REQUIRED, isolation = Isolation.DEFAULT, rollbackFor = Exception.class)

1. 属性:事务传播行为(Propagation)

Spring 中的事务传播行为(Propagation)指的是多个事务之间的相互影响关系,即在一个事务方法调用另一个事务方法时,这两个事务方法之间的关系。

Spring Framework 中定义了 7 种事务传播行为,分别为:

  • Propagation.REQUIRED:默认值,如果当前存在事务,则加入该事务,否则创建一个新事务。
  • Propagation.SUPPORTS:如果当前存在事务,则加入该事务,否则以非事务方式执行。
  • Propagation.MANDATORY:如果当前存在事务,则加入该事务,否则抛出异常。
  • Propagation.REQUIRES_NEW:创建一个新事务,并挂起当前事务(如果存在)。
  • Propagation.NOT_SUPPORTED:以非事务方式执行,并挂起当前事务(如果存在)。
  • Propagation.NEVER:以非事务方式执行,如果当前存在事务,则抛出异常。
  • Propagation.NESTED:如果当前存在事务,则在嵌套事务中执行,否则创建一个新事务。

2. 属性:事务隔离级别(Isolation)

事务隔离级别指的是多个事务之间的数据隔离程度。Spring Framework 中定义了 5 种事务隔离级别,分别为:

  • Isolation.DEFAULT:使用数据库的默认隔离级别。
  • Isolation.READ_UNCOMMITTED:最低的隔离级别,允许读取未提交的数据。
  • Isolation.READ_COMMITTED:允许读取已提交的数据。
  • Isolation.REPEATABLE_READ:保证在同一事务中多次读取同一数据时,得到的结果是一致的。
  • Isolation.SERIALIZABLE:最高的隔离级别,完全禁止不可重复读和幻读。

3. 属性:事务超时时间(timeout)

事务超时时间指的是事务执行所允许的最大时间。如果事务执行时间超过了指定的超时时间,则事务会被回滚。超时时间的单位为秒,默认值为 -1,表示永不超时。

4. 属性:只读属性(readOnly)

只读属性指的是事务是否只读。如果将事务设置为只读,那么在事务执行期间,所有对数据库的修改操作都会被禁止。只读属性可以提高事务的并发性能。

5. 属性:回滚规则(rollbackFor、noRollbackFor、rollbackForClassName、noRollbackForClassName)

回滚规则指的是哪些异常会导致事务回滚。可以使用 rollbackFornoRollbackForrollbackForClassNamenoRollbackForClassName 等属性来指定回滚规则。其中,rollbackFornoRollbackFor 属性用于指定需要回滚或不需要回滚的异常类型,而 rollbackForClassNamenoRollbackForClassName 属性用于指定需要回滚或不需要回滚的异常类名。

以上是 @Transactional 注解的常用属性和含义。需要注意的是,在使用 @Transactional 注解时,必须要将它所在的类或接口注册为 Spring Bean,且 @Transactional 注解只对 public 方法生效。

你可能感兴趣的:(smart,Spring,spring,boot,数据库,后端)