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


    一、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;
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    在上述示例中,我们使用 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);
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

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

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

    二、@Transactional详解

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

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

    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 方法生效。

  • 相关阅读:
    价格从9.9到几万元,凭票入场的VR元宇宙到底是什么体验?
    Windows OpenGL 图像灰度图
    SCI论文公式快捷获取
    SqlServer触发器使用整理
    [附源码]计算机毕业设计JAVA基于Java的护肤品网站
    kuangbin 斜率优化题单 代码
    第二十七讲.动态设置相关参数(replication为2和blocksize为10字节)
    2、k8s 集群安装
    【Python从入门到精通】(六)Python内置的数据类型-列表(list)和元组(tuple),九浅一深,十个章节,不信你用不到
    别太小看“静态免杀“
  • 原文地址:https://blog.csdn.net/Tracycoder/article/details/131629183