OBCP 每日一问|高频考点选择题

关于 OB 的事务 MVCC,以下正确的是?
A. undo 日志存放在 redo log 文件中
B. 事务快照版本号由 timestamp_ts 生成
C. 行的多版本数据全部保存在 MemTable,合并后直接删除
D. 写事务会阻塞读事务

正确答案是 B。

下面逐项分析:

A. undo 日志存放在 redo log 文件中 :x:

OceanBase 使用的是逻辑 redo 日志(或生理日志)来记录对 MemTable 的所有修改,并通过 Paxos 协议在多个节点间同步日志副本。 它并没有像 InnoDB 那样将 undo 日志存放在 redo log 文件中,undo 信息的维护方式不同。

B. 事务快照版本号由 timestamp_ts 生成 :white_check_mark:

OceanBase 的并发控制基于 MVCC 和行锁,事务在执行时需要获取快照版本(statement snapshot 或 transaction snapshot),提交时还需要获取提交版本(commit version)。这些版本号由全局时间戳服务(GTS)生成,本质上就是通过 timestamp_ts 来分配全局递增的时间戳,保证事务的有序性和一致性。

C. 行的多版本数据全部保存在 MemTable,合并后直接删除 :x:

OceanBase 基于 LSM-Tree 架构,数据修改先写入 MemTable(内存),当 MemTable 达到阈值后会通过合并(Major Compaction / Minor Compaction)写入 SSTable(磁盘)。合并过程中会进行多版本数据的去重和清理,但并不是"直接删除"所有旧版本——只有当旧版本不再被任何活跃事务引用时才会被回收。而且多版本数据也不会"全部"保存在 MemTable 中,合并后会持久化到 SSTable。

D. 写事务会阻塞读事务 :x:

OceanBase 基于 MVCC 实现了无锁读(lock-free read),读-读、读-写、写-读操作之间互不阻塞,只有写-写操作才会因为行锁互斥而产生等待。 这正是 MVCC 的核心优势之一。