Spring事务

在这里插入图片描述

什么是Spring事务

Spring 事务是本身就是对数据库的事务的支持,没有数据库的事务 Spring 是本身无法实现事务的。 Spring只提供了统一事务管理接口,具体的实现还是由各数据库自己实现。在使用 Spring 事务时,可以通过注解或编程方式将需要进行事务管理的方法和代码块标记为事务性操作,当这些操作被执行时,Spring 会负责开启时根据当前环境中设置的隔离级别,调整数据库隔离级别。

编程式

编程式事务管理使用TransactionTemplate模板方法类,此类使用了设计模式之行为型模式下的模板方法设计模式

示例代码
	@Autowired
    private TransactionTemplate transactionTemplate;

	@Test
    public void t1() {
        transactionTemplate.execute(new TransactionCallback<Object>() {
            @Override
            public Object doInTransaction(TransactionStatus t) {
                // 在这里执行事务操作
                // 可以进行数据库操作、调用其他需要事务支持的方法等
                return null;
            }
        });
    }

声明式

@Transactional 注解是基于 AOP(面向切面编程)的一种声明式事务管理方式。它允许你在不修改业务逻辑代码的情况下添加事务控制。以下是 @Transactional 如何工作的简要概述:

  1. 注解使用:当你在类或方法上使用 @Transactional 注解时,Spring 会通过 AOP 自动为这些类或方法织入事务管理的行为。

  2. 代理创建:Spring 会使用动态代理机制或 CGLIB 创建目标对象的代理。如果目标对象实现了至少一个接口,则使用 JDK 动态代理;如果没有实现任何接口,则使用 CGLIB 生成子类。

  3. 切点匹配:当带有 @Transactional 注解的方法被调用时,AOP 模块会检查该方法是否符合某个切点(Pointcut)的定义,即该方法是否应该被事务管理。

  4. 前置通知:如果该方法符合切点定义,那么在方法执行之前,AOP 模块会触发一个前置通知(Before advice),在这个阶段,Spring 事务管理器会开始一个新的数据库事务。

  5. 方法执行:接下来,实际的目标方法被执行。

  6. 后置通知:在方法正常执行完毕后,AOP 模块会触发后置通知(After returning advice),此时,事务管理器会检查是否有任何异常发生。如果没有异常,事务管理器会提交事务;如果有异常,并且该异常类型被 @Transactional 注解的 rollbackFor 属性指定,则事务会被回滚。

  7. 异常通知:如果在方法执行期间发生了异常,并且该异常未被捕获或处理,则 AOP 模块会触发异常通知(After throwing advice),在这种情况下,事务管理器会回滚事务。

  8. 最终通知:无论方法执行结果如何(正常结束或异常终止),AOP 模块都会触发最终通知(After (finally) advice),在这个阶段,可以进行一些清理工作。

Spring 事务的特点包括:

  1. 声明式事务管理
    Spring 提供了声明式事务管理,允许开发者通过使用 @Transactional 注解或 XML 配置来标记需要事务管理的方法或类。这种方式减少了对业务逻辑的侵入性,使得事务管理变得更加简洁。

  2. 编程式事务管理
    除了声明式事务管理之外,Spring 还支持编程式事务管理。通过使用 PlatformTransactionManager 接口,开发者可以直接控制事务的开始、提交和回滚。这种方式适合更复杂的事务控制需求。

  3. 事务传播行为
    Spring 支持多种事务传播行为,如 PROPAGATION_REQUIREDPROPAGATION_REQUIRES_NEWPROPAGATION_SUPPORTS 等,这些传播行为可以帮助开发者更好地控制事务的生命周期和嵌套事务的行为。

  4. 事务隔离级别
    Spring 允许开发者指定事务的隔离级别,如 ISOLATION_DEFAULTISOLATION_READ_UNCOMMITTEDISOLATION_READ_COMMITTEDISOLATION_REPEATABLE_READISOLATION_SERIALIZABLE。通过设置不同的隔离级别,可以平衡事务的并发性和隔离性。

  5. 事务回滚规则
    Spring 支持通过 @Transactional 注解的 rollbackFornoRollbackFor 属性来指定在遇到特定异常时是否回滚事务。这使得事务回滚策略更加灵活可控。

  6. 事务超时
    Spring 允许设置事务的超时时间,如果事务执行时间超过了指定的时间,事务将自动回滚。这有助于防止长时间运行的事务占用资源。

  7. 只读事务
    Spring 支持标记事务为只读,这样可以优化事务的执行,特别是在高并发环境下。数据库可以利用这一信息来提高性能,减少锁的竞争。

  8. 异常处理
    Spring 事务管理能够自动处理异常,并根据异常类型决定是否回滚事务。此外,还可以通过自定义异常来实现更精细的事务控制。

  9. 资源管理
    Spring 事务管理支持多种资源管理,包括 JDBC、Hibernate、JPA 等。这意味着开发者可以在同一个事务中操作多个持久化资源,提高了事务的一致性。

  10. 集成性
    Spring 事务管理与其他 Spring 组件紧密集成,如 AOP、Spring MVC、Spring Batch 等,使得事务管理更加容易与现有的应用程序架构相结合。

事务四大特性

事务是数据库系统中用来确保数据一致性和完整性的重要机制。事务具有四大特性,通常被称为 ACID 特性,即原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)和持久性(Durability)。

  1. 原子性(Atomicity)
  • 定义:事务中的所有操作要么全部成功完成,要么全部失败并回滚到事务开始前的状态。
  • 解释:想象事务是一个完整的任务,要么完全执行,要么根本不执行。如果事务在执行过程中遇到任何问题,系统会撤销所有已完成的操作,回到事务开始前的状态,确保数据不会处于半途而废的状态。
  1. 一致性(Consistency)
  • 定义:事务将数据库从一个一致状态转变为另一个一致状态。
  • 解释:事务执行前后,数据库的数据必须符合所有的规则和约束条件。这意味着事务执行的结果必须是正确的,不会破坏数据库的数据完整性。
  1. 隔离性(Isolation)
  • 定义:多个并发事务之间彼此隔离的程度。
  • 解释:当多个事务同时执行时,每个事务看起来好像是独立执行的,不会受到其他事务的影响。这确保了事务之间的数据互不影响,就好像每个事务都是单独执行的一样。
  1. 持久性(Durability)
  • 定义:一旦事务提交,所做的修改将永久保存在数据库中。
  • 解释:当事务成功完成后,所做的所有更改都会被永久保存下来,即使系统发生故障或崩溃,数据也不会丢失。这意味着事务提交后,数据会被安全地保存到硬盘上,确保数据的持久保存。

通过这些特性,事务能够确保数据库操作的安全性和可靠性。具体来说:

  • 原子性 确保事务要么全部完成,要么完全不执行。
  • 一致性 保证事务执行后数据库状态是正确的。
  • 隔离性 确保多个事务同时执行时互不干扰。
  • 持久性 保证事务提交后数据不会因系统故障而丢失。

事物传播机制

Spring 的事务传播行为是一种用于管理多个事务方法间交互的策略。它定义了当一个事务方法被另一个事务方法调用时,事务应该如何传播和处理。Spring 框架提供了七种不同的事务传播行为,每一种都有其特定的应用场景:

  1. PROPAGATION_REQUIRED(默认值)
  • 定义:如果当前存在事务,则加入到当前事务中;如果当前没有事务,则新建一个事务。
  • 适用场景:适用于大多数需要事务支持的操作,如增删改(CRUD 中的 Create、Update 和 Delete)。
  1. PROPAGATION_SUPPORTS
  • 定义:如果当前存在事务,则加入到当前事务中;如果当前没有事务,则以非事务方式执行。
  • 适用场景:适用于读取操作(CRUD 中的 Read),这类操作通常不需要事务支持,但如果被事务方法调用,可以参与事务。
  1. PROPAGATION_MANDATORY
  • 定义:要求当前必须存在事务,否则会抛出异常。
  • 适用场景:适用于那些必须在事务中执行的操作,通常用于中间层或辅助方法,这些方法期望总是处于事务上下文中。
  1. PROPAGATION_REQUIRES_NEW
  • 定义:无论当前是否存在事务,都会新建一个事务,并将当前事务挂起。
  • 适用场景:适用于需要独立的、嵌套的事务操作。例如,日志记录或其他辅助操作,这些操作应该与主事务相互独立,即使它们是从一个已经有事务的方法中调用的。
  1. PROPAGATION_NOT_SUPPORTED
  • 定义:以非事务方式执行操作,如果当前存在事务,则将其挂起。
  • 适用场景:适用于那些不需要事务支持的操作,确保即使在事务上下文中调用也不会参与事务。
  1. PROPAGATION_NEVER
  • 定义:以非事务方式执行操作,如果当前存在事务,则抛出异常。
  • 适用场景:适用于那些明确不能在事务中执行的操作,确保即使在事务上下文中调用也会抛出异常。
  1. PROPAGATION_NESTED
  • 定义:如果当前存在事务,则在嵌套事务中执行。嵌套事务可以独立地提交或回滚,但它们依赖于外部事务,只有外部事务提交后才能生效。
  • 适用场景:适用于需要创建一个可以独立于外部事务的子事务的情况,特别是当需要在现有事务中进行部分提交或回滚时。

spring 的事务隔离级别

  1. ISOLATION_DEFAULT(默认值)
  • 定义:采用底层数据库的默认隔离级别。对于大多数数据库来说,默认级别通常是取决于数据库的实现。例如,MySQL 的默认隔离级别是 REPEATABLE_READ
  • 适用场景:当不确定或不需要特别指定隔离级别时,可以使用此级别。
  1. ISOLATION_READ_UNCOMMITTED(读取未提交数据)
  • 定义:最低的隔离级别,允许一个事务读取另一个事务尚未提交的数据。
  • 适用场景:很少使用,因为可能会导致脏读、不可重复读和幻读的问题。
  1. ISOLATION_READ_COMMITTED(读取已提交数据)
  • 定义:要求一个事务只能读取到已经提交的数据。
  • 适用场景:避免了脏读的问题,但仍可能遇到不可重复读和幻读的问题。适用于需要较高并发性能,且可以接受一定程度数据不一致的情况。
  1. ISOLATION_REPEATABLE_READ(可重复读)
  • 定义:要求一个事务在整个过程中多次读取同样的数据时,结果保持一致。
  • 适用场景:避免了脏读和不可重复读的问题,但仍可能出现幻读的问题。适用于需要较高数据一致性的场景,但对并发性能有一定的影响。
  1. ISOLATION_SERIALIZABLE(串行化)
  • 定义:最高的隔离级别,通过强制事务串行执行来避免脏读、不可重复读和幻读的问题。
  • 适用场景:确保了最高的数据一致性,但降低了并发性能,因为事务需要按照顺序逐个执行。适用于对数据一致性要求极高的场景。
Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐