Spring事务传播机制和隔离级别
(文末附2025年Java面试高频考点宝典,含Spring全栈解析👉点击获取)
什么是Spring事务传播机制?
简单说就是多个事务方法互相调用时,事务该如何传递。比如方法A调用了方法B,此时B是沿用A的事务,还是自己新开事务?Spring定义了7种传播行为,面试常考的主要是这4种:
-
REQUIRED(默认)
- 如果当前存在事务,就加入该事务;没有事务则新建一个
- 举例:下单方法(有事务)调用了扣库存方法,扣库存会加入下单的事务

-
REQUIRES_NEW
- 无论当前是否有事务,都新建事务执行
- 新事务与旧事务完全独立,互不影响
- 典型场景:日志记录(即使主事务回滚,日志仍需保存)
-
NESTED
- 在当前事务中创建嵌套子事务
- 子事务回滚不影响主事务,但主事务回滚会导致子事务一起回滚
- 注意:需要数据库支持(如MySQL的Savepoint机制)
-
SUPPORTS
- 当前有事务就加入,没有就以非事务方式运行
- 适用于查询方法(可读事务/非事务皆可)
事务隔离级别解决什么问题?
主要解决数据库并发操作时的脏读、不可重复读、幻读三大问题。Spring支持5种隔离级别,但实际开发中常用的是这4种:
| 隔离级别 | 脏读 | 不可重复读 | 幻读 | 适用场景 |
|-------------------|------|------------|------|------------------------|
| READ_UNCOMMITTED | ✓ | ✓ | ✓ | 几乎不用 |
| READ_COMMITTED | ✗ | ✓ | ✓ | Oracle默认 |
| REPEATABLE_READ | ✗ | ✗ | ✓ | MySQL默认 |
| SERIALIZABLE | ✗ | ✗ | ✗ | 强一致性(性能差) |
图示说明不同隔离级别的锁差异:
面试高频坑点解析
-
传播机制选错导致事务失效
- 比如在REQUIRES_NEW中抛异常,如果外层用try-catch吞了异常,新事务会提交成功!
@Transactional public void order() { try { inventoryService.deductStock(); // REQUIRES_NEW } catch (Exception e) { // 此处吞异常会导致deductStock()的事务提交! } } -
隔离级别≠锁机制
- REPEATABLE_READ在MySQL通过MVCC实现,而Oracle的READ_COMMITTED也用了MVCC
- 别把数据库实现和标准混为一谈!
-
@Transactional失效场景
- 方法非public
- 同类方法自调用(需通过AOP代理调用)
- 异常类型非RuntimeException(需配置rollbackFor)
面试应答技巧
当被问到“如何选择传播行为和隔离级别”时,可以这样回答:
“传播行为取决于业务逻辑是否需要事务独立。比如资金操作必须用REQUIRES_NEW隔离风险,而日志记录可以用SUPPORTS避免事务拖慢速度。
隔离级别优先用数据库默认(MySQL选REPEATABLE_READ,Oracle用READ_COMMITTED),只有明确遇到幻读等问题时才考虑升级到SERIALIZABLE——但得评估性能代价。”

最后的小福利
最近在整理Java面试体系时,发现很多同学需要系统化的学习资料。这里分享一份2025年最新Java面试题库(含Spring全家桶深度解析):
🔗 网盘链接
提取码: 9b3g
如果大家需要购买面试鸭会员,可以通过面试鸭返利网找我,能返25元!用省下的钱喝杯咖啡,刷题更精神~
(本文由程序员技术分享社区原创,转载需授权)



