Spring 事务

目录


一、前言

在后端开发中,事务是保障数据一致性的核心机制之一。而在 Spring 体系中,事务被高度封装,使开发者可以通过简单的注解完成复杂的事务控制。

本文将从原理 + 实战 + 面试角度,系统梳理 Spring 事务的核心知识点,帮助你达到“能写、能讲、能深入”的面试水平。


二、什么是事务?

事务(Transaction)是数据库中的一组操作集合,具备 ACID 特性

  • A(Atomicity,原子性):要么全部成功,要么全部失败
  • C(Consistency,一致性):数据始终处于合法状态
  • I(Isolation,隔离性):多个事务互不干扰
  • D(Durability,持久性):提交后永久生效

👉 通俗理解:

事务就是一组“要么一起成功,要么一起失败”的操作。


三、Spring 事务的两种实现方式

3.1 编程式事务(了解)

需要通过TransactionTemplate或者TransactionManager手动控制事务:

1
2
3
4
5
6
7
TransactionStatus status = transactionManager.getTransaction(definition);
try {
// 业务逻辑
transactionManager.commit(status);
} catch (Exception e) {
transactionManager.rollback(status);
}

❌ 缺点:

  • 代码侵入性强
  • 可读性差
  • 易出错

3.2 声明式事务(重点🔥)

通过 @Transactional 注解实现:

1
2
3
4
5
@Transactional
public void transfer() {
// 扣款
// 加款
}

✅ 优点:

  • 无侵入
  • 简洁易用
  • 与 Spring 深度集成

👉 实际开发和面试的重点。


四、Spring 事务底层原理(核心🔥)

Spring 事务的本质是:

1
AOP + 代理模式

4.1 执行流程

  1. 调用目标方法

  2. 进入代理对象(Proxy)

  3. 开启事务

  4. 执行业务逻辑

  5. 判断执行结果:

    • 正常执行 → 提交事务(commit)
    • 抛出异常 → 回滚事务(rollback)

👉 本质总结:

@Transactional 本质是一个 AOP 增强


五、事务失效的常见场景(高频面试🔥)

5.1 方法不是 public

1
2
@Transactional
private void test() {}

👉 原因:Spring AOP 默认基于代理,只拦截 public 方法

5.2 自调用问题(经典面试题🔥)

1
2
3
4
5
6
public void A() {
B(); // ❌ 不生效
}

@Transactional
public void B() {}

👉 原因:
调用没有经过代理对象,而是 this.B() 直接调用

5.3 异常被捕获

1
2
3
4
try {
// 业务逻辑
} catch (Exception e) {
}

👉 结果:事务不会回滚 ❗

5.4 非运行时异常不会回滚

默认规则:

  • RuntimeException ✅
  • Error ✅
  • Checked Exception ❌

👉 解决:

1
@Transactional(rollbackFor = Exception.class)

5.5 没有被 Spring 管理

1
new UserService();

👉 必须通过 IoC 容器获取 Bean


六、事务传播行为(Propagation)🔥🔥🔥

用于控制多个事务方法之间的调用关系

传播行为 说明
REQUIRED(默认) 有事务就加入,没有就新建
REQUIRES_NEW 始终新建事务
SUPPORTS 有事务就用,没有就不用
NOT_SUPPORTED 不使用事务
MANDATORY 必须存在事务
NEVER 必须没有事务
NESTED 嵌套事务(支持回滚点)

⭐ 重点对比

REQUIRED

1
2
A(事务)
└── B(加入 A)

👉 一起提交 / 一起回滚

REQUIRES_NEW

1
2
3
A(事务)
└── 挂起
└── B(新事务)

👉 B 独立提交,不受 A 影响


七、事务隔离级别(Isolation)

用于解决并发问题:

隔离级别 解决问题
READ_UNCOMMITTED 无法避免脏读 ❌
READ_COMMITTED 避免脏读
REPEATABLE_READ(MySQL默认) 避免不可重复读
SERIALIZABLE 最强隔离,性能最差

八、Spring事务 vs 数据库事务

维度 Spring事务 数据库事务
本质 逻辑控制 物理实现
控制方式 AOP 数据库引擎
作用范围 方法级 SQL级

👉 本质关系:

1
Spring事务 = 对数据库事务的封装

九、核心源码组件(加分项🔥)

9.1 PlatformTransactionManager

事务管理器接口

常见实现:

  • DataSourceTransactionManager(JDBC)
  • JpaTransactionManager

9.2 TransactionInterceptor

👉 AOP事务拦截器核心类

9.3 TransactionAttribute

👉 定义事务规则(传播行为、隔离级别等)


十、面试标准回答模板(必背🔥)

1
2
3
4
5
6
7
Spring事务是基于AOP实现的声明式事务管理机制。

通过@Transactional注解,Spring会为目标方法生成代理对象,
在方法执行前开启事务,执行后根据是否发生异常决定提交或回滚。

默认只对RuntimeException进行回滚,同时支持事务传播行为和隔离级别,
用于解决多事务调用和并发问题。

十一、总结

Spring 事务的核心可以归纳为三点:

  1. 本质是 AOP + 代理机制

  2. 使用方式是 @Transactional 声明式事务

  3. 难点在于:

    • 事务失效场景
    • 传播行为
    • 隔离级别