{ "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": [] } ] }