[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"$f1b300lqgtfmoj":3,"$f250wz8h39yydc":8,"$fh74d94c47b56":29,"$fkpj7wqdcw5wa":33,"$f13mi7t10z7k8r":44,"toc-91144994-5-5":48},{"description":4,"domain":5,"id":6,"keywords":4,"title":7},"","api.kongjs.com",1,"默认",[9,20,24],{"children":10,"icon":4,"id":11,"linkType":12,"linkUrl":13,"parentId":14,"sort":15,"status":16,"target":17,"title":18,"visible":19},null,"447369447469600768","URL","\u002F","0",0,"1","_self","首页",true,{"children":10,"icon":4,"id":21,"linkType":12,"linkUrl":22,"parentId":14,"sort":15,"status":16,"target":17,"title":23,"visible":19},"447369693859794944","\u002Fnotes","笔记",{"children":10,"icon":4,"id":25,"linkType":26,"linkUrl":27,"parentId":14,"sort":15,"status":16,"target":17,"title":28,"visible":19},"447369977960976384","PAGE","\u002Fabout","关于我",{"category":10,"categoryId":10,"cover":10,"description":4,"fileId":10,"id":30,"publishAt":10,"tags":31,"title":32},"453167887230705664",[],"Mysql面试核心知识",[34,37,40],{"children":10,"description":4,"id":35,"noteId":30,"parentId":14,"sort":15,"status":16,"title":36},"453168082769158144","MySQL索引失效的原因、失效场景",{"children":10,"description":4,"id":38,"noteId":30,"parentId":14,"sort":6,"status":16,"title":39},"453168213975375872","MySQL事务原理、四大隔离级别、MVCC深度详解",{"children":10,"description":4,"id":41,"noteId":30,"parentId":14,"sort":42,"status":16,"title":43},"453168354300010496",2,"B树与B+树 核心原理、完整区别、数据库选型原因",{"content":45,"contentType":46,"description":4,"title":39,"wordCount":47},"# MySQL事务原理、四大隔离级别、MVCC深度详解\n\n本文一次性讲透 MySQL 事务核心体系：**事务ACID原理 → 并发事务三大问题 → 四大隔离级别演进与作用 → MVCC底层原理、实现机制、隐式\u002F显式快照、ReadView、undo log**，全程面试向、无废话、逻辑闭环，彻底打通事务隔离的底层逻辑。\n\n## 一、MySQL事务基础原理\n\n### 1\\. 事务定义\n\n事务是数据库**最小的原子执行单元**，一组SQL语句要么全部执行成功，要么全部失败回滚，保证数据操作的一致性与可靠性。MySQL InnoDB引擎支持事务，MyISAM不支持。\n\n### 2\\. 事务四大特性 ACID\n\n- **原子性（Atomicity）**：事务不可分割，要么全成功、要么全回滚，由 **undo log** 保证\n\n- **一致性（Consistency）**：事务执行前后，数据完整性、业务约束不变，是最终目标\n\n- **隔离性（Isolation）**：多个并发事务互相隔离、互不干扰，由 **锁 \\+ MVCC** 保证（核心考点）\n\n- **持久性（Durability）**：事务提交后数据永久生效，宕机不丢失，由 **redo log** 保证\n\n## 二、并发事务引发的三大问题（脏读、不可重复读、幻读）\n\n数据库隔离级别，本质就是**为了解决这三个并发问题**而分级设计，问题严重程度逐级递减。\n\n### 1\\. 脏读（Dirty Read）\n\n**定义**：一个事务读取到了**另一个事务未提交的脏数据**。\n\n**危害**：对方事务回滚后，当前读取的数据完全无效，数据失真。\n\n### 2\\. 不可重复读（Non\\-Repeatable Read）\n\n**定义**：**同一个事务内**，两次读取**同一条数据**，结果不一致（被其他事务update并提交）。\n\n**核心区别**：脏读是读未提交数据；不可重复读是读已提交数据，但前后不一致。\n\n### 3\\. 幻读（Phantom Read）\n\n**定义**：**同一个事务内**，范围查询时，前后结果条数不一致（被其他事务insert\u002Fdelete并提交）。\n\n**通俗区分**：\n\n- 不可重复读：**数据内容变了**（update）\n\n- 幻读：**数据条数变了**（insert\u002Fdelete）\n\n## 三、MySQL 四大隔离级别 \\& 解决问题对照表\n\nMySQL 默认隔离级别：**可重复读（RR）**，和SQL标准不完全一致，InnoDB在RR级别通过MVCC\\+间隙锁解决了幻读。\n\n|隔离级别|脏读|不可重复读|幻读|实现原理|\n|---|---|---|---|---|\n|**读未提交 Read Uncommitted**|存在|存在|存在|无隔离，直接读最新数据|\n|**读已提交 Read Committed（RC）**|✅ 解决|存在|存在|每次查询生成新ReadView|\n|**可重复读 Repeatable Read（RR默认）**|✅ 解决|✅ 解决|✅ InnoDB解决|事务首次查询生成ReadView，复用快照 \\+ 间隙锁|\n|**串行化 Serializable**|✅ 解决|✅ 解决|✅ 解决|读写互斥锁，完全串行执行，性能最低|\n\n### 级别核心总结\n\n- **RC**：解决脏读，每次读最新已提交数据，会不可重复读、幻读\n\n- **RR（MySQL默认）**：解决脏读、不可重复读，彻底解决幻读（区别于SQL标准）\n\n- 隔离级别越高，并发性能越低、数据一致性越强\n\n## 四、MVCC 全网最通俗深度解读（核心重点）\n\n**MVCC 全称：多版本并发控制**（Multi\\-Version Concurrency Control）\n\n**一句话定义**：**不加锁的前提下，通过数据历史版本快照，实现读写并发、读写不阻塞**。\n\n**核心价值**：读不加锁、写加锁，极大提升数据库并发性能，是RC、RR隔离级别的底层实现基石。\n\n### 1\\. MVCC 三大核心组件\n\n#### （1）undo log 回滚日志（数据版本链）\n\n每次修改数据前，会将**修改前的旧数据**存入undo log，多个版本串联形成**版本链表**。\n\n每条InnoDB记录隐藏三个字段：\n\n- **DB\\_TRX\\_ID**：最后修改当前行的事务ID\n\n- **DB\\_ROLL\\_PTR**：回滚指针，指向undo log上一个旧版本数据\n\n- **DB\\_ROW\\_ID**：行唯一ID（无主键时用作聚集索引）\n\n通过回滚指针，可以追溯出**一条完整的历史数据版本链**。\n\n#### （2）ReadView 读视图（版本筛选规则）\n\nReadView是MVCC的**核心过滤器**，用来判断：**当前事务能看到哪个版本的数据**。\n\nReadView 四大核心属性：\n\n- **m\\_ids**：当前活跃未提交的事务ID集合\n\n- **min\\_trx\\_id**：m\\_ids中最小的事务ID\n\n- **max\\_trx\\_id**：下一个即将分配的事务ID（最大值）\n\n- **creator\\_trx\\_id**：创建当前ReadView的事务ID\n\n#### （3）数据版本链 \\+ ReadView 匹配规则（必考）\n\n遍历版本链，判断当前版本是否可见：\n\n1. 如果版本 trx\\_id == 当前事务ID：可见（自己改的数据）\n\n2. 如果版本 trx\\_id \\\u003C min\\_trx\\_id：可见（事务已提交）\n\n3. 如果版本 trx\\_id \\>= max\\_trx\\_id：不可见（事务后开启）\n\n4. 如果 trx\\_id 在 min \\~ max 之间：判断是否在m\\_ids中，不在则可见，在则不可见，继续回溯上一版本\n\n### 2\\. RC 与 RR 隔离级别下 MVCC 的区别（面试灵魂考点）\n\n#### （1）RC 读已提交\n\n**规则**：**每执行一次SELECT查询，就重新生成一个全新的ReadView**\n\n**结果**：每次查询都能读到最新已提交数据，所以**无法解决不可重复读**\n\n#### （2）RR 可重复读（MySQL默认）\n\n**规则**：**事务内第一次SELECT查询时生成ReadView，后续查询复用该快照**\n\n**结果**：整个事务读取同一套历史快照，数据不变，**解决不可重复读**\n\n**补充**：RR级别下，**MVCC解决快照读幻读，间隙锁解决当前读幻读**，彻底杜绝幻读问题\n\n### 3\\. 快照读 VS 当前读（彻底搞懂幻读解决）\n\n#### 快照读（MVCC）\n\n普通 SELECT 查询，读取历史快照，**不加锁**，MVCC控制可见性\n\n#### 当前读（加锁读）\n\nSELECT \\.\\.\\. FOR UPDATE \u002F UPDATE \u002F DELETE \u002F INSERT，读取最新数据，**加行锁\\+间隙锁**\n\n**幻读完整解决方案**：\n\n- 快照读：MVCC 版本快照隔离，无幻读\n\n- 当前读：Next\\-Key Lock（临键锁\\+间隙锁）锁住区间，禁止新增数据，无幻读\n\n### 4\\. MVCC 适用场景与优缺点\n\n**适用级别**：仅 RC、RR 两个隔离级别（读未提交、串行化不用MVCC）\n\n**优点**：\n\n- 读写不阻塞、并发性能极高\n\n- 无锁隔离，大幅降低锁竞争开销\n\n**缺点**：\n\n- undo log 保留大量历史版本，占用存储空间\n\n- 版本链回溯需要消耗CPU，长时间未提交事务会堆积旧版本\n\n## 五、终极面试极简总结（背诵版）\n\n1. **事务四大特性**：原子性\\(undo\\)、一致性、隔离性\\(锁\\+MVCC\\)、持久性\\(redo\\)\n\n2. **三大并发问题**：脏读\\(未提交\\)、不可重复读\\(内容变\\)、幻读\\(条数变\\)\n\n3. **隔离级别差异**：RC解决脏读；RR解决脏读\\+不可重复读\\+幻读；串行化完全隔离\n\n4. **MVCC核心**：通过undo log版本链\\+ReadView视图，实现无锁读写并发\n\n5. **RC\u002FRR本质区别**：RC每次查询新视图；RR事务首次查询生成视图并复用\n\n6. **RR无幻读原因**：快照读靠MVCC，当前读靠间隙锁，双向解决","markdown",3483,{"frontmatter":49,"meta":50,"nodes":129},{},{"title":39,"description":51,"toc":52},"本文一次性讲透 MySQL 事务核心体系：事务ACID原理 → 并发事务三大问题 → 四大隔离级别演进与作用 → MVCC底层原理、实现机制、隐式\u002F显式快照、ReadView、undo log，全程面试向、无废话、逻辑闭环，彻底打通事务隔离的底层逻辑。",{"title":4,"searchDepth":53,"depth":53,"links":54},5,[55,66,78,85,126],{"id":56,"depth":42,"text":57,"children":58},"mysql","一、MySQL事务基础原理",[59,63],{"id":60,"depth":61,"text":62},"mysql-_1",3,"1. 事务定义",{"id":64,"depth":61,"text":65},"mysql-_2-acid","2. 事务四大特性 ACID",{"id":4,"depth":42,"text":67,"children":68},"二、并发事务引发的三大问题（脏读、不可重复读、幻读）",[69,72,75],{"id":70,"depth":61,"text":71},"-_1-dirty-read","1. 脏读（Dirty Read）",{"id":73,"depth":61,"text":74},"-_2-non-repeatable-read","2. 不可重复读（Non-Repeatable Read）",{"id":76,"depth":61,"text":77},"-_3-phantom-read","3. 幻读（Phantom Read）",{"id":79,"depth":42,"text":80,"children":81},"mysql-1","三、MySQL 四大隔离级别 & 解决问题对照表",[82],{"id":83,"depth":61,"text":84},"mysql-","级别核心总结",{"id":86,"depth":42,"text":87,"children":88},"mvcc","四、MVCC 全网最通俗深度解读（核心重点）",[89,103,113,123],{"id":90,"depth":61,"text":91,"children":92},"mvcc-_1-mvcc","1. MVCC 三大核心组件",[93,97,100],{"id":94,"depth":95,"text":96},"mvcc-_1-mvcc-_1undo-log",4,"（1）undo log 回滚日志（数据版本链）",{"id":98,"depth":95,"text":99},"mvcc-_1-mvcc-_2readview","（2）ReadView 读视图（版本筛选规则）",{"id":101,"depth":95,"text":102},"mvcc-_1-mvcc-_3-readview","（3）数据版本链 + ReadView 匹配规则（必考）",{"id":104,"depth":61,"text":105,"children":106},"mvcc-_2-rc-rr-mvcc","2. RC 与 RR 隔离级别下 MVCC 的区别（面试灵魂考点）",[107,110],{"id":108,"depth":95,"text":109},"mvcc-_2-rc-rr-mvcc-_1rc","（1）RC 读已提交",{"id":111,"depth":95,"text":112},"mvcc-_2-rc-rr-mvcc-_2rr-mysql","（2）RR 可重复读（MySQL默认）",{"id":114,"depth":61,"text":115,"children":116},"mvcc-_3-vs","3. 快照读 VS 当前读（彻底搞懂幻读解决）",[117,120],{"id":118,"depth":95,"text":119},"mvcc-_3-vs-mvcc","快照读（MVCC）",{"id":121,"depth":95,"text":122},"mvcc-_3-vs-","当前读（加锁读）",{"id":124,"depth":61,"text":125},"mvcc-_4-mvcc","4. MVCC 适用场景与优缺点",{"id":127,"depth":42,"text":128},"-1","五、终极面试极简总结（背诵版）",[130,134,143,146,149,156,158,197,199,206,208,218,224,226,239,245,247,254,259,275,277,284,380,382,399,401,407,415,421,423,426,436,439,459,465,467,477,480,506,508,511,526,528,530,538,547,549,556,564,574,576,578,585,587,593,598,606,608,614,619,627,632,640,642],[131,132,39],"h1",{"id":133},"mysqlmvcc",[135,136,137,138,142],"p",{},"本文一次性讲透 MySQL 事务核心体系：",[139,140,141],"strong",{},"事务ACID原理 → 并发事务三大问题 → 四大隔离级别演进与作用 → MVCC底层原理、实现机制、隐式\u002F显式快照、ReadView、undo log","，全程面试向、无废话、逻辑闭环，彻底打通事务隔离的底层逻辑。",[144,145,57],"h2",{"id":56},[147,148,62],"h3",{"id":60},[135,150,151,152,155],{},"事务是数据库",[139,153,154],{},"最小的原子执行单元","，一组SQL语句要么全部执行成功，要么全部失败回滚，保证数据操作的一致性与可靠性。MySQL InnoDB引擎支持事务，MyISAM不支持。",[147,157,65],{"id":64},[159,160,161,172,178,188],"ul",{},[162,163,164,167,168,171],"li",{},[139,165,166],{},"原子性（Atomicity）","：事务不可分割，要么全成功、要么全回滚，由 ",[139,169,170],{},"undo log"," 保证",[162,173,174,177],{},[139,175,176],{},"一致性（Consistency）","：事务执行前后，数据完整性、业务约束不变，是最终目标",[162,179,180,183,184,187],{},[139,181,182],{},"隔离性（Isolation）","：多个并发事务互相隔离、互不干扰，由 ",[139,185,186],{},"锁 + MVCC"," 保证（核心考点）",[162,189,190,193,194,171],{},[139,191,192],{},"持久性（Durability）","：事务提交后数据永久生效，宕机不丢失，由 ",[139,195,196],{},"redo log",[144,198,67],{"id":4},[135,200,201,202,205],{},"数据库隔离级别，本质就是",[139,203,204],{},"为了解决这三个并发问题","而分级设计，问题严重程度逐级递减。",[147,207,71],{"id":70},[135,209,210,213,214,217],{},[139,211,212],{},"定义","：一个事务读取到了",[139,215,216],{},"另一个事务未提交的脏数据","。",[135,219,220,223],{},[139,221,222],{},"危害","：对方事务回滚后，当前读取的数据完全无效，数据失真。",[147,225,74],{"id":73},[135,227,228,230,231,234,235,238],{},[139,229,212],{},"：",[139,232,233],{},"同一个事务内","，两次读取",[139,236,237],{},"同一条数据","，结果不一致（被其他事务update并提交）。",[135,240,241,244],{},[139,242,243],{},"核心区别","：脏读是读未提交数据；不可重复读是读已提交数据，但前后不一致。",[147,246,77],{"id":76},[135,248,249,230,251,253],{},[139,250,212],{},[139,252,233],{},"，范围查询时，前后结果条数不一致（被其他事务insert\u002Fdelete并提交）。",[135,255,256,230],{},[139,257,258],{},"通俗区分",[159,260,261,268],{},[162,262,263,264,267],{},"不可重复读：",[139,265,266],{},"数据内容变了","（update）",[162,269,270,271,274],{},"幻读：",[139,272,273],{},"数据条数变了","（insert\u002Fdelete）",[144,276,80],{"id":79},[135,278,279,280,283],{},"MySQL 默认隔离级别：",[139,281,282],{},"可重复读（RR）","，和SQL标准不完全一致，InnoDB在RR级别通过MVCC+间隙锁解决了幻读。",[285,286,287,309],"table",{},[288,289,290],"thead",{},[291,292,293,297,300,303,306],"tr",{},[294,295,296],"th",{},"隔离级别",[294,298,299],{},"脏读",[294,301,302],{},"不可重复读",[294,304,305],{},"幻读",[294,307,308],{},"实现原理",[310,311,312,330,347,364],"tbody",{},[291,313,314,320,323,325,327],{},[315,316,317],"td",{},[139,318,319],{},"读未提交 Read Uncommitted",[315,321,322],{},"存在",[315,324,322],{},[315,326,322],{},[315,328,329],{},"无隔离，直接读最新数据",[291,331,332,337,340,342,344],{},[315,333,334],{},[139,335,336],{},"读已提交 Read Committed（RC）",[315,338,339],{},"✅ 解决",[315,341,322],{},[315,343,322],{},[315,345,346],{},"每次查询生成新ReadView",[291,348,349,354,356,358,361],{},[315,350,351],{},[139,352,353],{},"可重复读 Repeatable Read（RR默认）",[315,355,339],{},[315,357,339],{},[315,359,360],{},"✅ InnoDB解决",[315,362,363],{},"事务首次查询生成ReadView，复用快照 + 间隙锁",[291,365,366,371,373,375,377],{},[315,367,368],{},[139,369,370],{},"串行化 Serializable",[315,372,339],{},[315,374,339],{},[315,376,339],{},[315,378,379],{},"读写互斥锁，完全串行执行，性能最低",[147,381,84],{"id":83},[159,383,384,390,396],{},[162,385,386,389],{},[139,387,388],{},"RC","：解决脏读，每次读最新已提交数据，会不可重复读、幻读",[162,391,392,395],{},[139,393,394],{},"RR（MySQL默认）","：解决脏读、不可重复读，彻底解决幻读（区别于SQL标准）",[162,397,398],{},"隔离级别越高，并发性能越低、数据一致性越强",[144,400,87],{"id":86},[135,402,403,406],{},[139,404,405],{},"MVCC 全称：多版本并发控制","（Multi-Version Concurrency Control）",[135,408,409,230,412,217],{},[139,410,411],{},"一句话定义",[139,413,414],{},"不加锁的前提下，通过数据历史版本快照，实现读写并发、读写不阻塞",[135,416,417,420],{},[139,418,419],{},"核心价值","：读不加锁、写加锁，极大提升数据库并发性能，是RC、RR隔离级别的底层实现基石。",[147,422,91],{"id":90},[424,425,96],"h4",{"id":94},[135,427,428,429,432,433,217],{},"每次修改数据前，会将",[139,430,431],{},"修改前的旧数据","存入undo log，多个版本串联形成",[139,434,435],{},"版本链表",[135,437,438],{},"每条InnoDB记录隐藏三个字段：",[159,440,441,447,453],{},[162,442,443,446],{},[139,444,445],{},"DB_TRX_ID","：最后修改当前行的事务ID",[162,448,449,452],{},[139,450,451],{},"DB_ROLL_PTR","：回滚指针，指向undo log上一个旧版本数据",[162,454,455,458],{},[139,456,457],{},"DB_ROW_ID","：行唯一ID（无主键时用作聚集索引）",[135,460,461,462,217],{},"通过回滚指针，可以追溯出",[139,463,464],{},"一条完整的历史数据版本链",[424,466,99],{"id":98},[135,468,469,470,473,474,217],{},"ReadView是MVCC的",[139,471,472],{},"核心过滤器","，用来判断：",[139,475,476],{},"当前事务能看到哪个版本的数据",[135,478,479],{},"ReadView 四大核心属性：",[159,481,482,488,494,500],{},[162,483,484,487],{},[139,485,486],{},"m_ids","：当前活跃未提交的事务ID集合",[162,489,490,493],{},[139,491,492],{},"min_trx_id","：m_ids中最小的事务ID",[162,495,496,499],{},[139,497,498],{},"max_trx_id","：下一个即将分配的事务ID（最大值）",[162,501,502,505],{},[139,503,504],{},"creator_trx_id","：创建当前ReadView的事务ID",[424,507,102],{"id":101},[135,509,510],{},"遍历版本链，判断当前版本是否可见：",[512,513,514,517,520,523],"ol",{},[162,515,516],{},"如果版本 trx_id == 当前事务ID：可见（自己改的数据）",[162,518,519],{},"如果版本 trx_id \u003C min_trx_id：可见（事务已提交）",[162,521,522],{},"如果版本 trx_id >= max_trx_id：不可见（事务后开启）",[162,524,525],{},"如果 trx_id 在 min ~ max 之间：判断是否在m_ids中，不在则可见，在则不可见，继续回溯上一版本",[147,527,105],{"id":104},[424,529,109],{"id":108},[135,531,532,230,535],{},[139,533,534],{},"规则",[139,536,537],{},"每执行一次SELECT查询，就重新生成一个全新的ReadView",[135,539,540,543,544],{},[139,541,542],{},"结果","：每次查询都能读到最新已提交数据，所以",[139,545,546],{},"无法解决不可重复读",[424,548,112],{"id":111},[135,550,551,230,553],{},[139,552,534],{},[139,554,555],{},"事务内第一次SELECT查询时生成ReadView，后续查询复用该快照",[135,557,558,560,561],{},[139,559,542],{},"：整个事务读取同一套历史快照，数据不变，",[139,562,563],{},"解决不可重复读",[135,565,566,569,570,573],{},[139,567,568],{},"补充","：RR级别下，",[139,571,572],{},"MVCC解决快照读幻读，间隙锁解决当前读幻读","，彻底杜绝幻读问题",[147,575,115],{"id":114},[424,577,119],{"id":118},[135,579,580,581,584],{},"普通 SELECT 查询，读取历史快照，",[139,582,583],{},"不加锁","，MVCC控制可见性",[424,586,122],{"id":121},[135,588,589,590],{},"SELECT ... FOR UPDATE \u002F UPDATE \u002F DELETE \u002F INSERT，读取最新数据，",[139,591,592],{},"加行锁+间隙锁",[135,594,595,230],{},[139,596,597],{},"幻读完整解决方案",[159,599,600,603],{},[162,601,602],{},"快照读：MVCC 版本快照隔离，无幻读",[162,604,605],{},"当前读：Next-Key Lock（临键锁+间隙锁）锁住区间，禁止新增数据，无幻读",[147,607,125],{"id":124},[135,609,610,613],{},[139,611,612],{},"适用级别","：仅 RC、RR 两个隔离级别（读未提交、串行化不用MVCC）",[135,615,616,230],{},[139,617,618],{},"优点",[159,620,621,624],{},[162,622,623],{},"读写不阻塞、并发性能极高",[162,625,626],{},"无锁隔离，大幅降低锁竞争开销",[135,628,629,230],{},[139,630,631],{},"缺点",[159,633,634,637],{},[162,635,636],{},"undo log 保留大量历史版本，占用存储空间",[162,638,639],{},"版本链回溯需要消耗CPU，长时间未提交事务会堆积旧版本",[144,641,128],{"id":127},[512,643,644,650,656,662,668,674],{},[162,645,646,649],{},[139,647,648],{},"事务四大特性","：原子性(undo)、一致性、隔离性(锁+MVCC)、持久性(redo)",[162,651,652,655],{},[139,653,654],{},"三大并发问题","：脏读(未提交)、不可重复读(内容变)、幻读(条数变)",[162,657,658,661],{},[139,659,660],{},"隔离级别差异","：RC解决脏读；RR解决脏读+不可重复读+幻读；串行化完全隔离",[162,663,664,667],{},[139,665,666],{},"MVCC核心","：通过undo log版本链+ReadView视图，实现无锁读写并发",[162,669,670,673],{},[139,671,672],{},"RC\u002FRR本质区别","：RC每次查询新视图；RR事务首次查询生成视图并复用",[162,675,676,679],{},[139,677,678],{},"RR无幻读原因","：快照读靠MVCC，当前读靠间隙锁，双向解决"]