# 1. ACID(原子性、一致性、隔离性、持久性)的精确语义与实现机制? A 原子性靠 undo 回滚,持久性靠 WAL/redo 落盘,隔离性靠锁/MVCC。 ✓ 正确答案 B 原子性通过 redo log 保证,持久性通过 undo log 保证。 C 一致性只需约束保证,与 ACID 其他特性无关。 D 隔离性只影响并发不影响正确性。
# 2. 事务的可见性边界,transaction_isolation、session 级别设置? A transaction_isolation 控制隔离级别,决定事务可见性边界(快照)。 ✓ 正确答案 B 隔离级别与快照边界无关。 C session 级别设置不影响当前事务。 D 隔离级别只能在数据库启动时设置。
# 3. 事务边界(BEGIN、COMMIT、ROLLBACK)的实现细节,PostgreSQL 的事务 ID、MySQL 的 trx_id? A ROLLBACK 会保留已提交的修改。 B 事务 ID 与可见性判定无关。 C COMMIT 不会写 WAL。 D PostgreSQL 用 xid、MySQL 用 trx_id 标记事务,是 MVCC 可见性判定的基础。 ✓ 正确答案
# 4. 嵌套事务(Nested Transaction)与保存点(SAVEPOINT)的差异? A 数据库支持真正的嵌套事务。 B SAVEPOINT 可以回滚整个事务。 C 数据库用 SAVEPOINT 模拟嵌套事务,提供部分回滚能力。 ✓ 正确答案 D SAVEPOINT 与 COMMIT 相同。
# 5. 长事务(Long Transaction)的危害,MVCC 版本膨胀、锁持有时间? A 长事务会自动释放锁。 B 长事务没有危害。 C 长事务只影响读不影响写。 D 长事务阻塞 MVCC 旧版本回收导致版本膨胀,并长时间持有锁。 ✓ 正确答案
# 6. 隐式事务与显式事务的差异,自动提交(AUTOCOMMIT)的影响? A 隐式事务可包含多条语句且原子。 B AUTOCOMMIT 关闭时默认自动提交。 C AUTOCOMMIT 开启时每条语句自动提交,显式事务用 BEGIN/COMMIT 控制。 ✓ 正确答案 D 显式事务不需要 COMMIT。
# 7. 分布式事务的 ACID 弱化,CAP 理论下的取舍? A 分布式事务在 CAP 下常弱化 ACID,采用最终一致性/2PC 等折中。 ✓ 正确答案 B 分布式事务能完美保持强 ACID。 C CAP 中一致性、可用性、分区容忍性三者可同时满足。 D 分布式事务无需考虑一致性。
# 8. WAL 如何支撑事务的持久性与崩溃恢复,刷盘时机与性能如何权衡? A WAL 先写日志再写数据页,崩溃时重放恢复,刷盘时机权衡持久性与性能。 ✓ 正确答案 B 提交时不需写 WAL。 C 崩溃恢复不看 WAL。 D group commit 会降低持久性。
# 9. MySQL InnoDB 默认 REPEATABLE READ,PostgreSQL 默认 READ COMMITTED 的差异? A 两者默认隔离级别相同。 B PostgreSQL 默认 RR,MySQL 默认 RC。 C MySQL InnoDB 默认 RR(全事务快照),PostgreSQL 默认 RC(每语句快照)。 ✓ 正确答案 D RR 与 RC 的快照时机相同。
# 10. MySQL 中设置隔离级别,SET TRANSACTION ISOLATION LEVEL? A 事务级设置只需在事务中任意位置执行。 B SET TRANSACTION ISOLATION LEVEL 可设置 session/global/事务级作用域。 ✓ 正确答案 C 隔离级别无法通过 SQL 修改。 D 全局级设置不需要权限。
# 11. PostgreSQL 中 READ UNCOMMITTED 等同于 READ COMMITTED(无脏读)? A PostgreSQL 读操作会读取未提交数据。 B PostgreSQL 的 READ UNCOMMITTED 允许脏读。 C PostgreSQL 与 MySQL 的 READ UNCOMMITTED 行为相同。 D PostgreSQL 的 READ UNCOMMITTED 等同 READ COMMITTED,因为 MVCC 无脏读。 ✓ 正确答案
# 12. REPEATABLE READ 在 PostgreSQL 中的快照读实现? A RR 需要额外锁才能读取。 B RR 下每个语句建立新快照。 C RR 能防止写偏斜。 D PostgreSQL 的 RR 在事务开始时建立快照并复用,全事务一致读。 ✓ 正确答案
# 13. SERIALIZABLE 在 PostgreSQL 中基于 SSI(Serializable Snapshot Isolation)的实现? A SSI 使用传统 2PL 锁实现串行化。 B PostgreSQL 的 SERIALIZABLE 基于 SSI,检测 rw-antidependency 环并回滚冲突事务。 ✓ 正确答案 C SSI 不检测任何冲突。 D SSI 与快照隔离无关。
# 14. SQL Server 的 SNAPSHOT 隔离级别与 RCSI(Read Committed Snapshot Isolation)的差异? A 两者都使用锁而非版本。 B SNAPSHOT 与 RCSI 完全相同。 C RCSI 提供事务级一致读。 D SNAPSHOT 是事务级快照,RCSI 是语句级快照。 ✓ 正确答案
# 15. SQL 标准定义的四个隔离级别,READ UNCOMMITTED、READ COMMITTED、REPEATABLE READ、SERIALIZABLE 的语义? A REPEATABLE READ 禁止幻读。 B READ UNCOMMITTED 禁止脏读。 C READ COMMITTED 禁止脏读但允许不可重复读,SERIALIZABLE 禁止全部异常。 ✓ 正确答案 D 四个隔离级别行为完全相同。
# 16. MySQL InnoDB 的默认隔离级别? A InnoDB 默认 READ COMMITTED。 B InnoDB 默认 REPEATABLE READ,用 Next-Key Lock 防幻读。 ✓ 正确答案 C InnoDB 默认 SERIALIZABLE。 D InnoDB 默认 READ UNCOMMITTED。
# 17. PostgreSQL 的隔离级别行为? A PostgreSQL 默认 READ COMMITTED,SERIALIZABLE 基于 SSI 检测冲突。 ✓ 正确答案 B PostgreSQL 默认 REPEATABLE READ。 C PostgreSQL 的 RR 允许不可重复读。 D PostgreSQL 的 SERIALIZABLE 用 2PL 锁。
# 18. 隔离级别与 MVCC 的关系,MVCC 如何实现读已提交与可重复读的快照隔离,幻读在 PostgreSQL 与 MySQL 中为何表现不同? A MVCC 用版本+快照实现 RC 每语句快照、RR 每事务快照。 ✓ 正确答案 B 幻读在 MySQL 与 PostgreSQL 中表现完全相同。 C MVCC 需要锁才能读。 D RR 与 RC 快照范围相同。
# 19. SELECT FOR SHARE 的语义? A FOR SHARE 加共享锁,多个事务可并发持有,但阻止写。 ✓ 正确答案 B FOR SHARE 加排他锁,独占该行。 C FOR SHARE 阻止其他事务读。 D FOR SHARE 与 FOR UPDATE 加锁相同。
# 20. MySQL InnoDB 中 SELECT(默认快照读)与 SELECT ... FOR UPDATE(当前读)的差异? A 两者都不加锁。 B 普通 SELECT 加 X 锁。 C FOR UPDATE 读快照版本。 D 普通 SELECT 是快照读不加锁,SELECT ... FOR UPDATE 是当前读加 X 锁。 ✓ 正确答案
# 21. PostgreSQL 中 SELECT 始终是快照读,UPDATE/DELETE 是当前读? A SELECT 读最新未提交数据。 B SELECT 加 X 锁。 C UPDATE 不需要加锁。 D PostgreSQL 的 SELECT 是快照读不加锁,UPDATE/DELETE 基于最新版本并加锁。 ✓ 正确答案
# 22. 当前读的锁行为,FOR UPDATE 加 X 锁、FOR SHARE 加 S 锁? A FOR UPDATE 加 S 锁。 B FOR UPDATE 加 X 锁独占,FOR SHARE 加 S 锁共享,S 与 S 兼容。 ✓ 正确答案 C FOR SHARE 加 X 锁。 D X 锁与 S 锁总是兼容。
# 23. 快照读与写偏斜(Write Skew)的关联? A SERIALIZABLE 与 RR 完全相同。 B 快照隔离能防止写偏斜。 C 写偏斜与并发无关。 D 快照隔离读不锁、无冲突检测,故不防写偏斜,需 SERIALIZABLE 检测。 ✓ 正确答案
# 24. 快照读的隔离级别依赖,REPEATABLE READ 始终读取事务开始时的快照? A RR 快照在事务开始时建立。 B RR 下每个语句建立新快照。 C RR 下快照在事务首次读时建立并复用,而非事务开始时。 ✓ 正确答案 D RR 与 RC 快照时机相同。
# 25. RR 隔离级别下的快照读与 Phantom 问题? A 两者都靠锁防幻读。 B PostgreSQL 快照读天然防幻读,MySQL 当前读用 Next-Key Lock 防幻读。 ✓ 正确答案 C 快照读能看到幻行。 D RR 无法防幻读。
# 26. MySQL FOR UPDATE 的语义? A FOR UPDATE 不加锁。 B FOR UPDATE 读快照版本。 C FOR UPDATE 是当前读并加 X 锁,锁持续到事务结束。 ✓ 正确答案 D FOR UPDATE 加 S 锁。
# 27. SSI 的谓词锁(Predicate Lock)与 SIReadLock 的语义? A SIReadLock 记录事务读过的范围,用于 SSI 检测读写依赖。 ✓ 正确答案 B SIReadLock 会阻塞其他事务写。 C 谓词锁是实际阻塞的锁。 D SSI 不需要记录读范围。
# 28. SSI(Serializable Snapshot Isolation)的核心思想,检测序列化异常(rw-antidependency cycles)? A SSI 与快照隔离无关。 B SSI 用 2PL 锁实现串行化。 C SSI 不检测冲突。 D SSI 在快照隔离基础上检测 rw-antidependency 环,回滚冲突事务保证可串行化。 ✓ 正确答案
# 30. 原子性(Atomicity)的实现,日志(Write-Ahead Log)保证部分提交回滚? A 原子性不需要日志。 B 原子性靠 undo 日志记录旧版本,回滚时恢复,保证全成功或全回滚。 ✓ 正确答案 C 部分提交是允许的。 D 回滚不依赖任何日志。
# 31. 持久性(Durability)的实现,fsync、组提交(Group Commit)? A group commit 会降低持久性。 B 持久性不需要日志落盘。 C 持久性靠提交时 fsync 日志落盘,group commit 合并刷盘提升吞吐。 ✓ 正确答案 D fsync 与持久性无关。
# 32. 三种读取异常(Dirty Read、Non-Repeatable Read、Phantom Read)的定义? A 三种异常无法区分。 B 脏读是读到已提交数据。 C 不可重复读与幻读定义相同。 D 脏读读到未提交数据,不可重复读两次查询结果不同,幻读范围查询出现新行。 ✓ 正确答案
# 33. REPEATABLE READ 的应用? A RR 允许事务内不可重复读。 B RR 每个语句读不同快照。 C RR 适合需要事务内一致快照的场景,如报表、对账。 ✓ 正确答案 D RR 只适合写多场景。
# 34. 快照读(Snapshot Read)与当前读(Current Read)的语义差异,读快照 vs 读最新已提交? A 当前读不加锁。 B 快照读读最新数据。 C 快照读读 MVCC 快照不加锁,当前读读最新已提交并加锁。 ✓ 正确答案 D 普通 SELECT 是当前读。
# 35. SERIALIZABLE 与 REPEATABLE READ 的根本差异,除快照读外的额外冲突检测? A SERIALIZABLE 在快照读外额外检测写冲突,RR 不检测写偏斜。 ✓ 正确答案 B RR 与 SERIALIZABLE 完全相同。 C RR 检测写偏斜。 D SERIALIZABLE 只提供快照读。
# 36. SSI 的失败检测,40001 序列化失败时的应用重试? A 40001 表示提交成功。 B 40001 无需处理。 C 40001 只需重试失败语句。 D 40001 序列化失败需应用捕获、回滚并重试整个事务。 ✓ 正确答案
# 37. fsync 频率如何影响事务持久性与吞吐,group commit 的作用是什么? A group commit 降低持久性。 B group commit 合并多个事务的 fsync,在保持持久性同时提升吞吐。 ✓ 正确答案 C fsync 频率与持久性无关。 D 高频 fsync 总是提升吞吐。
# 38. READ COMMITTED 的应用? A RC 允许脏读。 B RC 提供事务级一致读。 C READ COMMITTED 每语句读最新已提交,适合 OLTP 实时场景。 ✓ 正确答案 D RC 禁止不可重复读。
# 39. SSI 的性能开销,谓词锁维护代价? A SSI 与快照隔离开销相同。 B SSI 无任何额外开销。 C SSI 的谓词锁维护与依赖追踪引入额外内存与 CPU 开销。 ✓ 正确答案 D 谓词锁不影响性能。
# 40. SQLSTATE 40001 的含义? A 40001 无需处理。 B 40001 表示成功提交。 C 40001 表示连接失败。 D SQLSTATE 40001 表示序列化失败,应用需回滚并重试整个事务。 ✓ 正确答案