事务传播机制和隔离级别:面试必问的数据库核心
作为程序员,数据库事务的事务传播机制和隔离级别绝对是高频面试点。今天咱们就用人话聊聊这两个核心概念,帮你轻松应对技术面!
为什么需要事务传播机制?
想象一个场景:你在下单支付时,既要扣余额又要生成订单。这两个操作必须同时成功或失败——这就是事务传播机制存在的意义!它定义了多个事务方法相互调用时,事务该如何传递和协作。Spring框架就提供了7种传播行为(比如REQUIRED、REQUIRES_NEW),面试官超爱问这个!
📁 2025年Java面试宝典:
链接: https://pan.baidu.com/s/1RUVf75gmDVsg8MQp4yRChg?pwd=9b3g
提取码: 9b3g

七种传播行为详解(划重点!)
- REQUIRED(默认)
- 如果当前有事务,就加入;没有就新建。就像拼车——有车就上,没车自己打一辆!
- REQUIRES_NEW
- 无论当前有无事务,直接开新事务。相当于自己单独打车,不受别人影响。
- SUPPORTS
- 有事务就加入,没有就算了。佛系模式,适合查询操作。
- NOT_SUPPORTED
- 非事务运行,挂起当前事务。比如写日志,别影响主流程。
- MANDATORY
- 必须在事务中调用,否则抛异常!像地铁进站——没票不让进。
- NEVER
- 必须在非事务环境调用,否则报错。反着来的
MANDATORY。
- 必须在非事务环境调用,否则报错。反着来的
- NESTED
- 嵌套事务,子事务回滚不影响主事务。类似游戏存档点。
事务的隔离级别解决什么问题?
当多个事务并发执行时,可能会出现三大经典问题:
- 脏读:读到别人未提交的数据(像偷看别人没保存的文档)
- 不可重复读:同一事务内两次读取结果不同(数据被修改了)
- 幻读:突然多出或少了数据(像变魔术一样)
隔离级别就是用来控制这些问题的"阀门"!MySQL默认是REPEATABLE_READ,而Oracle用READ_COMMITTED。

四大隔离级别对比
| 级别 | 脏读 | 不可重复读 | 幻读 | 性能 | |---------------------|------|------------|------|------| | READ_UNCOMMITTED| ❌ | ❌ | ❌ | ⚡⚡⚡ | | READ_COMMITTED | ✅ | ❌ | ❌ | ⚡⚡ | | REPEATABLE_READ | ✅ | ✅ | ❌ | ⚡ | | SERIALIZABLE | ✅ | ✅ | ✅ | 🐢 |
口诀:级别越高,问题越少,性能越差!实际开发中要根据业务权衡。
高频面试题破解
面试官:REQUIRES_NEW和NESTED有什么区别?
你:
REQUIRES_NEW完全独立,新事务失败不影响原事务NESTED是嵌套关系,子事务回滚会导致主事务回滚到保存点(但主事务可继续)
面试官:怎么避免幻读?
你:
- 升级到
SERIALIZABLE(太重) - 在
REPEATABLE_READ下用间隙锁(Gap Locks) - 使用乐观锁版本号控制
🚀 会员福利提示:
如果需要购买面试鸭会员,可以通过 面试鸭返利网 找我,返利25元!海量真题+解析助你轻松通关!

记住:事务传播机制决定事务的"协作方式",隔离级别解决"并发冲突"。理解本质比死记配置更重要!遇到场景题时,先画事务流程图再写答案,准能让面试官眼前一亮!


