Files
examination/topics/database/mysql-transaction-isolation/fill_blank.json
T
wonder 515acbcc7f
Deploy Examination / deploy (push) Successful in 4s
feat: add database topic group with 105 questions
- mysql-acid (35): undo/redo log, WAL, 崩溃恢复三阶段, 两阶段提交
- mysql-transaction-isolation (35): 四隔离级别, 三异常, Read View, 快照读/当前读, next-key lock
- redis-persistence (35): RDB/AOF/混合持久化, AOF 重写, vs binlog/redo log
- 每子主题: single_choice×10 + fill_blank×10 + short_answer×10 + code_reading×5
- 全部通过 question.schema.json 校验
2026-09-07 19:17:38 +08:00

201 lines
9.1 KiB
JSON
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
{
"topic": "mysql-transaction-isolation",
"type": "fill_blank",
"schema_version": "1.0.0",
"generated": "2026-09-07T00:00:00+08:00",
"questions": [
{
"id": "fb-001",
"type": "fill_blank",
"difficulty": 1,
"tags": [
"隔离级别"
],
"question": "MySQL InnoDB 支持的四级事务隔离级别从低到高分别是:____(读未提交)、____(读已提交)、____(可重复读)、____(串行化),其中 MySQL 默认的隔离级别是____。",
"answer": [
"READ UNCOMMITTED",
"READ COMMITTED",
"REPEATABLE READ",
"SERIALIZABLE",
"REPEATABLE READ"
],
"answer_rule": "ordered",
"explanation": "ISO 定义的四隔离级别:READ UNCOMMITTED(允许脏读)、READ COMMITTED(只读已提交,出现不可重复读)、REPEATABLE READ(可重复读 + 间隙锁防幻读)、SERIALIZABLE(所有读加锁串行)。MySQL InnoDB 默认级别是 REPEATABLE READ。",
"source": null,
"related": []
},
{
"id": "fb-002",
"type": "fill_blank",
"difficulty": 2,
"tags": [
"脏读",
"不可重复读",
"幻读"
],
"question": "事务并发读取产生的三种异常现象分别是:____(读到其他事务未提交的数据)、____(同一事务中同一行两次读取的值不同)、____(同一事务中满足同一条件的行数发生变化,由其他事务插入造成)。",
"answer": [
"脏读",
"不可重复读",
"幻读"
],
"answer_rule": "ordered",
"explanation": "脏读(Dirty Read)读到未提交数据;不可重复读(Non-Repeatable Read)同一行两次值不一致;幻读(Phantom Read)满足条件的行数量发生变化(靠插入)。幻读比不可重复读高级,需要防止插入。",
"source": null,
"related": []
},
{
"id": "fb-003",
"type": "fill_blank",
"difficulty": 2,
"tags": [
"MVCC",
"版本链"
],
"question": "InnoDB 中每行数据通常隐藏着两个关键列:____(最后修改该行的事务 ID)与 ____(指向 undo log 中该行旧版本的指针),多个旧版本通过该指针串成一条____。",
"answer": [
"DB_TRX_ID",
"DB_ROLL_PTR",
"版本链"
],
"answer_rule": "ordered",
"explanation": "DB_TRX_ID 记录最后修改该行的事务 ID,DB_ROLL_PTR 指向 undo log 中的旧版本记录,从而将同一逻辑行的所有历史版本串联成版本链。MVCC 靠 ReadView 沿版本链回溯找到对当前事务可见的版本。",
"source": null,
"related": []
},
{
"id": "fb-004",
"type": "fill_blank",
"difficulty": 3,
"tags": [
"Read View",
"MVCC"
],
"question": "Read View 主要由四个字段构成:____(快照创建时未提交的事务 ID 集合,通常简称 m_ids)、____(该集合里最小的事务 ID)、____(当前已分配的最大事务 ID 加一或最大、用于判断新启动的事务)、____(当前事务的 ID)。",
"answer": [
"m_ids",
"min_trx_id",
"max_trx_id",
"creator_trx_id"
],
"answer_rule": "ordered",
"explanation": "ReadView 的四个核心字段:m_ids(未提交事务集合)、min_trx_id(其中最小 trx_id)、max_trx_id(下一条将要分配的事务 id,或最大 trx_id)、creator_trx_id(创建该 ReadView 的事务自身 id)。可见性判断以这四者为依据。",
"source": null,
"related": []
},
{
"id": "fb-005",
"type": "fill_blank",
"difficulty": 3,
"tags": [
"Read View",
"版本链"
],
"question": "设某行版本的事务 ID 为 trx_id。Read View 判断可见性的顺序中:若 trx_id 等于当前创建 Read View 的事务 ID,则____;若 trx_id < min_trx_id,说明该版本事务已提交,____;若 trx_id 大于等于 max_trx_id,说明该事务在快照创建后才启动,____;若 trx_id 处于 m_ids 集合中,说明该事务还未提交,____。",
"answer": [
"可见",
"可见",
"不可见",
"不可见"
],
"answer_rule": "ordered",
"explanation": "可见性判断顺序:① creator 自己(本事务)修改的版本可见;② trx_id < min_trx_id:已提交,可见;③ trx_id >= max_trx_id:快照之后才启动的事务,不可见;④ trx_id 在 m_ids 中:还未提交,不可见;⑤ 否则可见。若版本链头不可见,则沿 DB_ROLL_PTR 继续向前回溯找可见版本。",
"source": null,
"related": []
},
{
"id": "fb-006",
"type": "fill_blank",
"difficulty": 2,
"tags": [
"快照读",
"当前读"
],
"question": "普通 SELECT(不加锁,基于 MVCC 读一致性快照)称为____;SELECT ... FOR UPDATE / UPDATE / DELETE / INSERT 读取最新已提交数据并加锁,称为____。",
"answer": [
"快照读",
"当前读"
],
"answer_rule": "ordered",
"explanation": "快照读(Snapshot Read,也称一致性非锁定读)走 MVCC,不加锁;当前读(Current Read)读到最新已提交数据并对读取行加锁。当前读在 REPEATABLE READ 下配合间隙锁/临键锁可防止幻读。",
"source": null,
"related": []
},
{
"id": "fb-007",
"type": "fill_blank",
"difficulty": 3,
"tags": [
"隔离级别",
"Read View"
],
"question": "在 ____ 级别下,每执行一次普通 SELECT 都会新建 Read View,因此同一事务两次读取同一行可能得到不同值(不可重复读);在 ____ 级别下,事务的第一条 SELECT 建立 Read View 并在整个事务内复用,从而保证可重复读。",
"answer": [
"READ COMMITTED",
"REPEATABLE READ"
],
"answer_rule": "ordered",
"explanation": "RC:每次快照读新建 ReadView,能看到其他事务最新提交,导致不可重复读。RR:首个 SELECT(或首次访问行数据)创建 ReadView 后复用,整个事务看到的是一致快照,故可重复读。",
"source": null,
"related": []
},
{
"id": "fb-008",
"type": "fill_blank",
"difficulty": 2,
"tags": [
"行锁",
"间隙锁",
"临键锁"
],
"question": "InnoDB 的三种主要锁类型分别是:只锁定某条具体记录的____、锁定索引区间但不锁定具体记录的____(为防其他事务在此区间插入)、两种组合而成的____(同时锁定记录与其之前的区间)。",
"answer": [
"Record Lock(行锁)",
"Gap Lock(间隙锁)",
"Next-Key Lock(临键锁)"
],
"answer_rule": "ordered",
"explanation": "Record Lock 锁定单条记录;Gap Lock 锁定索引间的空隙(防止插入造成幻行,本身不保护已存在的具体行);Next-Key Lock 是 Record Lock 与 Gap Lock 的组合(前开后闭区间),既锁记录又锁间隙,是防幻读的核心手段。",
"source": null,
"related": []
},
{
"id": "fb-009",
"type": "fill_blank",
"difficulty": 4,
"tags": [
"隔离级别",
"幻读"
],
"question": "REPEATABLE READ 下,通过两条路径防止幻读:普通 SELECT 走 MVCC____,读取一致快照;而 SELECT ... FOR UPDATE 等____读则会使用临键锁/间隙锁锁定范围,阻止并发事务在范围内____(插入数据)从而产生幻读。",
"answer": [
"快照读",
"当前读",
"插入"
],
"answer_rule": "ordered",
"explanation": "RR 下防幻读是『快照读一致性』与『当前读加间隙锁』的结合:快照读读到的都是固定的旧快照,不会看到别的新插入行;当前读则通过 Gap Lock / Next-Key Lock 阻塞范围内的并发插入,保证当前读也不会读到幻行。注意这两种机制分开来看,单纯 MVCC 快照读其实不能完全阻止其他事务对旧区间('对本事务而言)被修改而产生的幻行,因此间隙锁仍是必要的。",
"source": null,
"related": []
},
{
"id": "fb-010",
"type": "fill_blank",
"difficulty": 3,
"tags": [
"隔离级别",
"MVCC"
],
"question": "MySQL 事务隔离性本身是通过『锁 + ____』两种机制共同实现的:锁用于解决____(写写)冲突以及当前读场景下的幻读防止(间隙锁/临键锁),而____用于实现多版本并发控制,使普通读(快照读)与写操作可以互不阻塞并行执行。",
"answer": [
"MVCC",
"写",
"MVCC"
],
"answer_rule": "ordered",
"explanation": "锁解决写写互斥与区间防插入,MVCC(Multi-Version Concurrency Control)解决读写之间不互斥(快照读不加锁)。两者叠加才完整支撑 InnoDB 的隔离语义。",
"source": null,
"related": []
}
]
}