Spring事务 核心知识

Spring 事务核心知识 总结,覆盖原理、机制、常考点、易踩坑


一、什么是 Spring 事务(本质)

Spring 事务是 对数据库事务的统一抽象与管理机制,核心目标:

保证一组数据库操作要么全部成功,要么全部失败(ACID)

Spring 并不直接实现事务,而是 基于底层事务实现(JDBC / JTA)进行封装

核心抽象接口:
Spring FrameworkPlatformTransactionManager


二、Spring 事务的两种使用方式(必考)

1. 编程式事务(了解即可)

java 复制代码
TransactionStatus status = transactionManager.getTransaction(definition);
try {
    // 业务逻辑
    transactionManager.commit(status);
} catch (Exception e) {
    transactionManager.rollback(status);
}

特点:

  • 灵活
  • 侵入性强
  • 实际项目很少用

2. 声明式事务(重点 + 面试主流)

java 复制代码
@Transactional
public void createOrder() {
    // 业务代码
}

本质:

  • AOP + 代理

  • 在方法前后自动:

    • 开启事务
    • 提交 / 回滚事务

常用注解:

  • @Transactional

三、Spring 事务的底层原理(高频面试)

核心链路(一定要能说清)

复制代码
@Transactional
   ↓
Spring AOP(代理对象)
   ↓
TransactionInterceptor
   ↓
PlatformTransactionManager
   ↓
JDBC / JPA / MyBatis

关键点

  • 通过 AOP 在方法调用前后增强
  • 事务对象绑定到 当前线程(ThreadLocal)
  • 同一线程中共享同一个数据库连接

面试回答模板:

Spring 事务是基于 AOP 实现的,@Transactional 会生成代理对象,在方法执行前通过 PlatformTransactionManager 开启事务,方法正常结束提交事务,出现异常时根据回滚规则进行回滚。


四、事务四大特性(ACID)------基础必答

特性 含义
原子性(Atomicity) 操作要么全成功要么全失败
一致性(Consistency) 事务前后数据状态合法
隔离性(Isolation) 并发事务互不干扰
持久性(Durability) 提交后数据永久保存

五、事务传播行为(Propagation)

面试最容易被追问的一块

常见传播行为(记住这 5 个)

行为 含义 使用场景
REQUIRED(默认) 有事务就加入,没有就新建 90% 场景
REQUIRES_NEW 总是新建事务 日志、审计
SUPPORTS 有就用,没有不用 查询
NOT_SUPPORTED 挂起当前事务 非事务逻辑
NESTED 嵌套事务(保存点) 局部回滚

高频追问:

  • REQUIRED vs REQUIRES_NEW 区别
  • 内层异常是否影响外层事务

六、事务隔离级别(并发必考)

Spring 直接使用数据库隔离级别:

隔离级别 解决问题
READ_UNCOMMITTED 可能脏读
READ_COMMITTED(Oracle 默认) 防止脏读
REPEATABLE_READ(MySQL 默认) 防止不可重复读
SERIALIZABLE 串行,性能最低

面试重点:

  • MySQL 默认隔离级别?
  • 幻读如何解决?

七、回滚规则(非常容易踩坑)

1. 默认回滚规则(必背)

只回滚 RuntimeException 和 Error

❌ 不会回滚:

java 复制代码
throw new Exception();

2. 指定回滚规则

java 复制代码
@Transactional(rollbackFor = Exception.class)

面试追问:

为什么 Spring 默认不回滚 checked exception?

标准回答:

因为 checked exception 通常代表可预期的业务异常,而不是系统错误。


八、Spring 事务失效的 8 大原因(面试杀手锏)

常见失效场景

  1. 方法不是 public
java 复制代码
@Transactional
private void test() {} 
  1. 同类方法内部调用
java 复制代码
this.methodA(); //不走代理
  1. 异常被 try-catch 吃掉
java 复制代码
try {
   ...
} catch (Exception e) {
   // 没抛出
}
  1. 抛出 checked exception
java 复制代码
throw new Exception(); // 默认不回滚
  1. 数据库引擎不支持事务(MyISAM)

  2. 没有被 Spring 管理(new 出来的对象)

  3. @Transactional 加在接口方法上(JDK 代理问题)

  4. 传播行为设置不当(REQUIRES_NEW)

面试建议:

至少能说出 3--5 个事务失效原因


九、@Transactional 的常用属性(面试可加分)

java 复制代码
@Transactional(
    propagation = Propagation.REQUIRED,
    isolation = Isolation.READ_COMMITTED,
    rollbackFor = Exception.class,
    timeout = 30,
    readOnly = true
)

十、一句话面试总结(背下来)

Spring 事务本质是基于 AOP 的声明式事务管理,通过 PlatformTransactionManager 统一控制事务的开启、提交和回滚,事务基于线程绑定数据库连接,常见问题集中在传播行为、回滚规则以及代理失效场景。


相关推荐
小杨互联网10 小时前
项目CyberScan Pro jar软件安全成分分析插件
java·jar·软件成分分析·jar安全分析
组合缺一10 小时前
Java 版 Claude Code CLI 来了!(国产开源项目)Solon Code CLI 发布
java·ai·开源·llm·solon·cli·claudecode
javaIsGood_11 小时前
Java基础面试题
java·开发语言
indexsunny11 小时前
互联网大厂Java求职面试实战:基于电商场景的技术问答及解析
java·spring boot·redis·kafka·security·microservices·面试指导
Forget_855011 小时前
RHEL——LVS模式
java·开发语言·lvs
渣瓦攻城狮12 小时前
互联网大厂Java面试:从数据库连接池到分布式缓存及微服务
java·redis·spring cloud·微服务·hikaricp·数据库连接池·分布式缓存
罗超驿12 小时前
13.1 万字长文,深入解析--抽象类和接口
java·开发语言
A懿轩A12 小时前
【Java 基础编程】Java 面向对象进阶:static/final、抽象类、接口、单例模式
java·开发语言·单例模式
lifallen12 小时前
后缀数组 (Suffix Array)
java·数据结构·算法
逆境不可逃12 小时前
LeetCode 热题 100 之 76.最小覆盖子串
java·算法·leetcode·职场和发展·滑动窗口