515acbcc7f
Deploy Examination / deploy (push) Successful in 4s
- 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 校验
201 lines
9.1 KiB
JSON
201 lines
9.1 KiB
JSON
{
|
||
"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": []
|
||
}
|
||
]
|
||
} |