数据库常见面试题
→ 返回 面试
事务与 ACID
| 问题 | 简答 | 深入 |
|---|---|---|
| 什么是事务? | 一组 SQL 的逻辑单元,全成功或全回滚 | 数据库事务 |
| ACID 含义? | 原子性 undo;一致性约束;隔离性 MVCC+锁;持久性 redo | 同上 |
| 四种隔离级别? | RU / RC / RR / Serializable;MySQL 默认 RR | 数据库事务与隔离级别 |
| 脏读 / 不可重复读 / 幻读? | 未提交 / 同事务两次读不同 / 两次查询行数不同 | 同上 |
| MVCC 是什么? | 多版本 + ReadView 快照读,减少加锁 | 同上 |
| RR 和 RC 区别? | RC 每次 SELECT 新快照;RR 事务首次读固定快照 | 同上 |
@Transactional 和 DB 事务关系? | Spring 在方法级管理 Connection 提交/回滚 | SpringBoot事务失效场景 |
Q:一致性谁保证?
A:一致性是目标;原子性、隔离性、持久性 + 业务约束(唯一索引、CHECK)共同保证。
死锁与锁
| 问题 | 简答 | 深入 |
|---|---|---|
| 数据库死锁是什么? | 两事务互相等对方持有的行锁/间隙锁 | 数据库死锁 |
| InnoDB 怎么处理? | 死锁检测,回滚代价小的事务,返回 1213 | 同上 |
| 如何预防? | 固定加锁顺序、缩短事务、小批量、避免事务内 RPC | 同上 |
| 行锁 / 间隙锁 / Next-Key Lock? | 锁行;锁索引间隙防幻读;行锁+间隙(RR 默认) | 事务与锁 |
FOR UPDATE vs LOCK IN SHARE MODE? | X 排他锁 vs S 共享锁 | 同上 |
| DB 死锁 vs 线程死锁? | DB:锁数据行;OS:锁线程/资源 | 死锁 |
索引与 SQL
详见 MySQL索引与SQL优化。
| 问题 | 简答 | 深入 |
|---|---|---|
| 为什么用 B+ 树? | 矮树少 IO、叶链表支持范围扫描 | MySQL索引与SQL优化 |
| 聚簇 vs 非聚簇? | InnoDB 主键即聚簇;二级索引叶存主键再回表 | 同上 |
| 最左前缀? | 联合索引从左列开始匹配;跳列难用索引 | 同上 |
| 索引失效场景? | 函数/隐式转换、左模糊 %xx、OR、不符合最左 | 同上 |
| 覆盖索引? | 查询列全在索引中,无需回表 | 同上 |
| EXPLAIN 看什么? | type、key、rows、Extra(Using index/filesort) | 同上 |
Q:主键为什么推荐自增?
A:顺序插入减少页分裂;随机 UUID 导致频繁分裂,写性能差。
架构与复制
| 问题 | 简答 | 深入 |
|---|---|---|
| 主从复制原理? | binlog → relay log → 从库重放 | 主从复制 |
| 读写分离问题? | 主从延迟导致读不到刚写数据 | 同上 |
| 分库分表? | 垂直拆库、水平拆表;跨库 JOIN 消失 | 分库分表 |
| 垂直 vs 水平? | 按业务/列拆 vs 按数据量/哈希拆 | 同上 |
分布式事务
| 问题 | 简答 | 深入 |
|---|---|---|
| 为什么需要? | 跨库/跨服务无法靠单机 ACID | 数据库事务 |
| 2PC / XA? | 协调者 prepare → commit;强一致、阻塞、性能差 | 同上 |
| TCC? | Try 预留 → Confirm / Cancel;业务侵入 | 同上 |
| SAGA? | 本地事务 + 补偿;最终一致 | 同上 |
| 本地消息表? | 业务写库与消息同事务,异步投递 | 同上 |
| Seata AT 模式? | 拦截 SQL、undo log 自动回滚 | Seata |
Q:微服务常用哪种?
A:能异步则 SAGA / 本地消息表;强一致资金场景 TCC;尽量避免跨库 XA。
Redis(常一起问)
详见 Redis常见面试题。
| 问题 | 简答 | 深入 |
|---|---|---|
| Redis 单线程为何快? | 内存 + IO 多路复用 + 简单数据结构 | Redis常见面试题 |
| 缓存穿透 / 击穿 / 雪崩? | 空值/布隆;热点 key 互斥;TTL 打散 | 同上 |
| Redis 分布式锁? | SET key val NX EX;Redisson 看门狗 | 同上 |
| Redis 事务? | MULTI/EXEC,非 ACID 隔离,无回滚 | 同上 |
答题建议
- 事务题:先 ACID → 隔离级别 → 三种读异常 → MVCC/锁怎么防。
- 死锁题:画 T1 锁 A 等 B、T2 锁 B 等 A;再说 InnoDB 检测 + 应用重试。
- 索引题:B+ 树 → 聚簇/回表 → 最左前缀 → EXPLAIN。
- 分布式题:说清强一致 vs 最终一致取舍,别只会背 2PC。
专题笔记
相关
- Redis常见面试题 — Redis 专题
- SpringBoot事务失效场景 — Spring 层事务失效
- Java常见面试题 — Java 并发死锁(线程级)
- MVCC与事务 — PostgreSQL 对比