MySQL 的事务隔离级别是数据库并发控制的核心概念,用于解决多个事务同时执行时可能产生的数据不一致问题。
1. 默认值是
MySQL InnoDB 默认的事务隔离级别是:REPEATABLE READ(可重复读)。
2. 四大隔离级别
三个读异常(脏话、不可重复、幻读)解释:
- 脏读(Dirty Read) :读到别的事务尚未提交的数据(万一对方回滚,这数据就是废的)。
- 不可重复读(Non-Repeatable Read) :在同一事务内,两次读取同一条记录,因为别的事务修改并提交了,导致两次结果不一致(侧重于"改")。
- 幻读(Phantom Read) :在同一事务内,两次执行同一个范围查询,因为别的事务插入或删除了数据,导致第二次多出或少了几行(侧重于"增删")。
隔离级别与异常的关系

注意 :按照 SQL 标准,
REPEATABLE READ是允许 幻读发生的。但 MySQL InnoDB 通过强大的 Next-Key Lock(间隙锁+行锁)机制,在这个级别下就杜绝了幻读。
3.MySQL 默认选择 REPEATABLE READ
绝大多数数据库(如 Oracle、PostgreSQL、SQL Server)默认都是 READ COMMITTED, MySQL 偏要与众不同。
背后的原因不是"拍脑袋",而是由 MySQL 主从复制(基于 Binlog)的历史架构 和性能权衡 共同决定的。我们可以把原因归结为三大支柱。
一:历史包袱与二进制日志(Binlog)的安全隐患(最核心原因)
在 MySQL 5.0 及更早版本,以及当下的某些配置中,Binlog 的格式默认是 STATEMENT(基于语句的复制) 。也就是记录 UPDATE t SET a=1 WHERE id>10; 这样的 SQL 语句,然后发给从库执行。
如果此时隔离级别是 READ COMMITTED,会产生一个致命的主从数据不一致风险,我们称之为 "Binlog 惊魂"。
让我们用一个经典场景复现:
假设主库并发执行以下两个事务(TxA 删除,TxB 插入):
- 时间线 1 :TxA 执行
DELETE FROM users WHERE age > 20;(此时表中有 id=1(age=25) 和 id=2(age=30),TxA 扫到了这两行,准备删除)。 - 时间线 2 :TxB 执行
INSERT INTO users (id=3, age=28);并提交。 - 时间线 3 :在
READ COMMITTED下,由于 TxB 已提交,TxA 重新评估条件age>20,新插入的 id=3 不会被删除(因为 InnoDB 的删除是通过隐藏字段标记,此时读视图变化了)。 - 时间线 4:TxA 提交。
主库结果:id=1, id=2 被删,id=3 存活。
Binlog 记录顺序 (STATEMENT 格式):INSERT(TxB)的记录先写,DELETE(TxA)的记录后写。
从库重放 :先执行 INSERT(插入 id=3),后执行 DELETE FROM users WHERE age>20;。在从库执行 DELETE 时,它会无情地把刚刚插入的 id=3 也一起删掉!
- 从库结果:id=1, id=2, id=3 全部被删。
结果:主从数据严重不一致!
如何解决? MySQL 选择了 REPEATABLE READ。在这个级别下,TxA 在开始时创建了一致性读视图(快照),直到事务结束。即使 TxB 提交了,TxA 依然看不到新插入的 id=3,所以 DELETE 语句只作用于它一开始看到的 id=1 和 id=2。这条 DELETE 记录到 Binlog 后,在从库执行时,也会基于从库的 MVCC 快照(或锁机制)只删除这两条,从而保证主从一致。
二:MVCC 实现的读视图(Read View)生成时机不同
为了理解这一点,我们需要看一眼 InnoDB 的多版本并发控制(MVCC)机制。
- 在
READ COMMITTED下 :每一次 执行普通SELECT语句,都会重新生成一个新的 Read View(读视图)。 - 在
REPEATABLE READ下 :事务内第一次 执行SELECT时生成一个 Read View,并复用到事务结束。
这种机制天然保证了"可重复读",并且为基于 STATEMENT 的复制提供了确定性。虽然生成 Read View 的代价很小,但 REPEATABLE READ 减少了生成的次数,在极高并发下对 CPU 也算一种微小的优化。
三:间隙锁(Gap Lock)带来的"伪串行化"优势
虽然 REPEATABLE READ 带来了更高的数据一致性保障,但它也有代价------间隙锁。为了阻止幻读,InnoDB 不仅锁住命中的行(Record Lock),还会锁住索引记录之间的"间隙"(Gap Lock)。
#mermaid-svg-xe8AUtU0jSH7DB9I{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-xe8AUtU0jSH7DB9I .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-xe8AUtU0jSH7DB9I .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-xe8AUtU0jSH7DB9I .error-icon{fill:#552222;}#mermaid-svg-xe8AUtU0jSH7DB9I .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-xe8AUtU0jSH7DB9I .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-xe8AUtU0jSH7DB9I .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-xe8AUtU0jSH7DB9I .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-xe8AUtU0jSH7DB9I .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-xe8AUtU0jSH7DB9I .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-xe8AUtU0jSH7DB9I .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-xe8AUtU0jSH7DB9I .marker{fill:#333333;stroke:#333333;}#mermaid-svg-xe8AUtU0jSH7DB9I .marker.cross{stroke:#333333;}#mermaid-svg-xe8AUtU0jSH7DB9I svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-xe8AUtU0jSH7DB9I p{margin:0;}#mermaid-svg-xe8AUtU0jSH7DB9I .edge{stroke-width:3;}#mermaid-svg-xe8AUtU0jSH7DB9I .section--1 rect,#mermaid-svg-xe8AUtU0jSH7DB9I .section--1 path,#mermaid-svg-xe8AUtU0jSH7DB9I .section--1 circle,#mermaid-svg-xe8AUtU0jSH7DB9I .section--1 path{fill:hsl(240, 100%, 76.2745098039%);}#mermaid-svg-xe8AUtU0jSH7DB9I .section--1 text{fill:#ffffff;}#mermaid-svg-xe8AUtU0jSH7DB9I .node-icon--1{font-size:40px;color:#ffffff;}#mermaid-svg-xe8AUtU0jSH7DB9I .section-edge--1{stroke:hsl(240, 100%, 76.2745098039%);}#mermaid-svg-xe8AUtU0jSH7DB9I .edge-depth--1{stroke-width:17;}#mermaid-svg-xe8AUtU0jSH7DB9I .section--1 line{stroke:hsl(60, 100%, 86.2745098039%);stroke-width:3;}#mermaid-svg-xe8AUtU0jSH7DB9I .lineWrapper line{stroke:#ffffff;}#mermaid-svg-xe8AUtU0jSH7DB9I .disabled,#mermaid-svg-xe8AUtU0jSH7DB9I .disabled circle,#mermaid-svg-xe8AUtU0jSH7DB9I .disabled text{fill:lightgray;}#mermaid-svg-xe8AUtU0jSH7DB9I .disabled text{fill:#efefef;}#mermaid-svg-xe8AUtU0jSH7DB9I .section-0 rect,#mermaid-svg-xe8AUtU0jSH7DB9I .section-0 path,#mermaid-svg-xe8AUtU0jSH7DB9I .section-0 circle,#mermaid-svg-xe8AUtU0jSH7DB9I .section-0 path{fill:hsl(60, 100%, 73.5294117647%);}#mermaid-svg-xe8AUtU0jSH7DB9I .section-0 text{fill:black;}#mermaid-svg-xe8AUtU0jSH7DB9I .node-icon-0{font-size:40px;color:black;}#mermaid-svg-xe8AUtU0jSH7DB9I .section-edge-0{stroke:hsl(60, 100%, 73.5294117647%);}#mermaid-svg-xe8AUtU0jSH7DB9I .edge-depth-0{stroke-width:14;}#mermaid-svg-xe8AUtU0jSH7DB9I .section-0 line{stroke:hsl(240, 100%, 83.5294117647%);stroke-width:3;}#mermaid-svg-xe8AUtU0jSH7DB9I .lineWrapper line{stroke:black;}#mermaid-svg-xe8AUtU0jSH7DB9I .disabled,#mermaid-svg-xe8AUtU0jSH7DB9I .disabled circle,#mermaid-svg-xe8AUtU0jSH7DB9I .disabled text{fill:lightgray;}#mermaid-svg-xe8AUtU0jSH7DB9I .disabled text{fill:#efefef;}#mermaid-svg-xe8AUtU0jSH7DB9I .section-1 rect,#mermaid-svg-xe8AUtU0jSH7DB9I .section-1 path,#mermaid-svg-xe8AUtU0jSH7DB9I .section-1 circle,#mermaid-svg-xe8AUtU0jSH7DB9I .section-1 path{fill:hsl(80, 100%, 76.2745098039%);}#mermaid-svg-xe8AUtU0jSH7DB9I .section-1 text{fill:black;}#mermaid-svg-xe8AUtU0jSH7DB9I .node-icon-1{font-size:40px;color:black;}#mermaid-svg-xe8AUtU0jSH7DB9I .section-edge-1{stroke:hsl(80, 100%, 76.2745098039%);}#mermaid-svg-xe8AUtU0jSH7DB9I .edge-depth-1{stroke-width:11;}#mermaid-svg-xe8AUtU0jSH7DB9I .section-1 line{stroke:hsl(260, 100%, 86.2745098039%);stroke-width:3;}#mermaid-svg-xe8AUtU0jSH7DB9I .lineWrapper line{stroke:black;}#mermaid-svg-xe8AUtU0jSH7DB9I .disabled,#mermaid-svg-xe8AUtU0jSH7DB9I .disabled circle,#mermaid-svg-xe8AUtU0jSH7DB9I .disabled text{fill:lightgray;}#mermaid-svg-xe8AUtU0jSH7DB9I .disabled text{fill:#efefef;}#mermaid-svg-xe8AUtU0jSH7DB9I .section-2 rect,#mermaid-svg-xe8AUtU0jSH7DB9I .section-2 path,#mermaid-svg-xe8AUtU0jSH7DB9I .section-2 circle,#mermaid-svg-xe8AUtU0jSH7DB9I .section-2 path{fill:hsl(270, 100%, 76.2745098039%);}#mermaid-svg-xe8AUtU0jSH7DB9I .section-2 text{fill:#ffffff;}#mermaid-svg-xe8AUtU0jSH7DB9I .node-icon-2{font-size:40px;color:#ffffff;}#mermaid-svg-xe8AUtU0jSH7DB9I .section-edge-2{stroke:hsl(270, 100%, 76.2745098039%);}#mermaid-svg-xe8AUtU0jSH7DB9I .edge-depth-2{stroke-width:8;}#mermaid-svg-xe8AUtU0jSH7DB9I .section-2 line{stroke:hsl(90, 100%, 86.2745098039%);stroke-width:3;}#mermaid-svg-xe8AUtU0jSH7DB9I .lineWrapper line{stroke:#ffffff;}#mermaid-svg-xe8AUtU0jSH7DB9I .disabled,#mermaid-svg-xe8AUtU0jSH7DB9I .disabled circle,#mermaid-svg-xe8AUtU0jSH7DB9I .disabled text{fill:lightgray;}#mermaid-svg-xe8AUtU0jSH7DB9I .disabled text{fill:#efefef;}#mermaid-svg-xe8AUtU0jSH7DB9I .section-3 rect,#mermaid-svg-xe8AUtU0jSH7DB9I .section-3 path,#mermaid-svg-xe8AUtU0jSH7DB9I .section-3 circle,#mermaid-svg-xe8AUtU0jSH7DB9I .section-3 path{fill:hsl(300, 100%, 76.2745098039%);}#mermaid-svg-xe8AUtU0jSH7DB9I .section-3 text{fill:black;}#mermaid-svg-xe8AUtU0jSH7DB9I .node-icon-3{font-size:40px;color:black;}#mermaid-svg-xe8AUtU0jSH7DB9I .section-edge-3{stroke:hsl(300, 100%, 76.2745098039%);}#mermaid-svg-xe8AUtU0jSH7DB9I .edge-depth-3{stroke-width:5;}#mermaid-svg-xe8AUtU0jSH7DB9I .section-3 line{stroke:hsl(120, 100%, 86.2745098039%);stroke-width:3;}#mermaid-svg-xe8AUtU0jSH7DB9I .lineWrapper line{stroke:black;}#mermaid-svg-xe8AUtU0jSH7DB9I .disabled,#mermaid-svg-xe8AUtU0jSH7DB9I .disabled circle,#mermaid-svg-xe8AUtU0jSH7DB9I .disabled text{fill:lightgray;}#mermaid-svg-xe8AUtU0jSH7DB9I .disabled text{fill:#efefef;}#mermaid-svg-xe8AUtU0jSH7DB9I .section-4 rect,#mermaid-svg-xe8AUtU0jSH7DB9I .section-4 path,#mermaid-svg-xe8AUtU0jSH7DB9I .section-4 circle,#mermaid-svg-xe8AUtU0jSH7DB9I .section-4 path{fill:hsl(330, 100%, 76.2745098039%);}#mermaid-svg-xe8AUtU0jSH7DB9I .section-4 text{fill:black;}#mermaid-svg-xe8AUtU0jSH7DB9I .node-icon-4{font-size:40px;color:black;}#mermaid-svg-xe8AUtU0jSH7DB9I .section-edge-4{stroke:hsl(330, 100%, 76.2745098039%);}#mermaid-svg-xe8AUtU0jSH7DB9I .edge-depth-4{stroke-width:2;}#mermaid-svg-xe8AUtU0jSH7DB9I .section-4 line{stroke:hsl(150, 100%, 86.2745098039%);stroke-width:3;}#mermaid-svg-xe8AUtU0jSH7DB9I .lineWrapper line{stroke:black;}#mermaid-svg-xe8AUtU0jSH7DB9I .disabled,#mermaid-svg-xe8AUtU0jSH7DB9I .disabled circle,#mermaid-svg-xe8AUtU0jSH7DB9I .disabled text{fill:lightgray;}#mermaid-svg-xe8AUtU0jSH7DB9I .disabled text{fill:#efefef;}#mermaid-svg-xe8AUtU0jSH7DB9I .section-5 rect,#mermaid-svg-xe8AUtU0jSH7DB9I .section-5 path,#mermaid-svg-xe8AUtU0jSH7DB9I .section-5 circle,#mermaid-svg-xe8AUtU0jSH7DB9I .section-5 path{fill:hsl(0, 100%, 76.2745098039%);}#mermaid-svg-xe8AUtU0jSH7DB9I .section-5 text{fill:black;}#mermaid-svg-xe8AUtU0jSH7DB9I .node-icon-5{font-size:40px;color:black;}#mermaid-svg-xe8AUtU0jSH7DB9I .section-edge-5{stroke:hsl(0, 100%, 76.2745098039%);}#mermaid-svg-xe8AUtU0jSH7DB9I .edge-depth-5{stroke-width:-1;}#mermaid-svg-xe8AUtU0jSH7DB9I .section-5 line{stroke:hsl(180, 100%, 86.2745098039%);stroke-width:3;}#mermaid-svg-xe8AUtU0jSH7DB9I .lineWrapper line{stroke:black;}#mermaid-svg-xe8AUtU0jSH7DB9I .disabled,#mermaid-svg-xe8AUtU0jSH7DB9I .disabled circle,#mermaid-svg-xe8AUtU0jSH7DB9I .disabled text{fill:lightgray;}#mermaid-svg-xe8AUtU0jSH7DB9I .disabled text{fill:#efefef;}#mermaid-svg-xe8AUtU0jSH7DB9I .section-6 rect,#mermaid-svg-xe8AUtU0jSH7DB9I .section-6 path,#mermaid-svg-xe8AUtU0jSH7DB9I .section-6 circle,#mermaid-svg-xe8AUtU0jSH7DB9I .section-6 path{fill:hsl(30, 100%, 76.2745098039%);}#mermaid-svg-xe8AUtU0jSH7DB9I .section-6 text{fill:black;}#mermaid-svg-xe8AUtU0jSH7DB9I .node-icon-6{font-size:40px;color:black;}#mermaid-svg-xe8AUtU0jSH7DB9I .section-edge-6{stroke:hsl(30, 100%, 76.2745098039%);}#mermaid-svg-xe8AUtU0jSH7DB9I .edge-depth-6{stroke-width:-4;}#mermaid-svg-xe8AUtU0jSH7DB9I .section-6 line{stroke:hsl(210, 100%, 86.2745098039%);stroke-width:3;}#mermaid-svg-xe8AUtU0jSH7DB9I .lineWrapper line{stroke:black;}#mermaid-svg-xe8AUtU0jSH7DB9I .disabled,#mermaid-svg-xe8AUtU0jSH7DB9I .disabled circle,#mermaid-svg-xe8AUtU0jSH7DB9I .disabled text{fill:lightgray;}#mermaid-svg-xe8AUtU0jSH7DB9I .disabled text{fill:#efefef;}#mermaid-svg-xe8AUtU0jSH7DB9I .section-7 rect,#mermaid-svg-xe8AUtU0jSH7DB9I .section-7 path,#mermaid-svg-xe8AUtU0jSH7DB9I .section-7 circle,#mermaid-svg-xe8AUtU0jSH7DB9I .section-7 path{fill:hsl(90, 100%, 76.2745098039%);}#mermaid-svg-xe8AUtU0jSH7DB9I .section-7 text{fill:black;}#mermaid-svg-xe8AUtU0jSH7DB9I .node-icon-7{font-size:40px;color:black;}#mermaid-svg-xe8AUtU0jSH7DB9I .section-edge-7{stroke:hsl(90, 100%, 76.2745098039%);}#mermaid-svg-xe8AUtU0jSH7DB9I .edge-depth-7{stroke-width:-7;}#mermaid-svg-xe8AUtU0jSH7DB9I .section-7 line{stroke:hsl(270, 100%, 86.2745098039%);stroke-width:3;}#mermaid-svg-xe8AUtU0jSH7DB9I .lineWrapper line{stroke:black;}#mermaid-svg-xe8AUtU0jSH7DB9I .disabled,#mermaid-svg-xe8AUtU0jSH7DB9I .disabled circle,#mermaid-svg-xe8AUtU0jSH7DB9I .disabled text{fill:lightgray;}#mermaid-svg-xe8AUtU0jSH7DB9I .disabled text{fill:#efefef;}#mermaid-svg-xe8AUtU0jSH7DB9I .section-8 rect,#mermaid-svg-xe8AUtU0jSH7DB9I .section-8 path,#mermaid-svg-xe8AUtU0jSH7DB9I .section-8 circle,#mermaid-svg-xe8AUtU0jSH7DB9I .section-8 path{fill:hsl(150, 100%, 76.2745098039%);}#mermaid-svg-xe8AUtU0jSH7DB9I .section-8 text{fill:black;}#mermaid-svg-xe8AUtU0jSH7DB9I .node-icon-8{font-size:40px;color:black;}#mermaid-svg-xe8AUtU0jSH7DB9I .section-edge-8{stroke:hsl(150, 100%, 76.2745098039%);}#mermaid-svg-xe8AUtU0jSH7DB9I .edge-depth-8{stroke-width:-10;}#mermaid-svg-xe8AUtU0jSH7DB9I .section-8 line{stroke:hsl(330, 100%, 86.2745098039%);stroke-width:3;}#mermaid-svg-xe8AUtU0jSH7DB9I .lineWrapper line{stroke:black;}#mermaid-svg-xe8AUtU0jSH7DB9I .disabled,#mermaid-svg-xe8AUtU0jSH7DB9I .disabled circle,#mermaid-svg-xe8AUtU0jSH7DB9I .disabled text{fill:lightgray;}#mermaid-svg-xe8AUtU0jSH7DB9I .disabled text{fill:#efefef;}#mermaid-svg-xe8AUtU0jSH7DB9I .section-9 rect,#mermaid-svg-xe8AUtU0jSH7DB9I .section-9 path,#mermaid-svg-xe8AUtU0jSH7DB9I .section-9 circle,#mermaid-svg-xe8AUtU0jSH7DB9I .section-9 path{fill:hsl(180, 100%, 76.2745098039%);}#mermaid-svg-xe8AUtU0jSH7DB9I .section-9 text{fill:black;}#mermaid-svg-xe8AUtU0jSH7DB9I .node-icon-9{font-size:40px;color:black;}#mermaid-svg-xe8AUtU0jSH7DB9I .section-edge-9{stroke:hsl(180, 100%, 76.2745098039%);}#mermaid-svg-xe8AUtU0jSH7DB9I .edge-depth-9{stroke-width:-13;}#mermaid-svg-xe8AUtU0jSH7DB9I .section-9 line{stroke:hsl(0, 100%, 86.2745098039%);stroke-width:3;}#mermaid-svg-xe8AUtU0jSH7DB9I .lineWrapper line{stroke:black;}#mermaid-svg-xe8AUtU0jSH7DB9I .disabled,#mermaid-svg-xe8AUtU0jSH7DB9I .disabled circle,#mermaid-svg-xe8AUtU0jSH7DB9I .disabled text{fill:lightgray;}#mermaid-svg-xe8AUtU0jSH7DB9I .disabled text{fill:#efefef;}#mermaid-svg-xe8AUtU0jSH7DB9I .section-10 rect,#mermaid-svg-xe8AUtU0jSH7DB9I .section-10 path,#mermaid-svg-xe8AUtU0jSH7DB9I .section-10 circle,#mermaid-svg-xe8AUtU0jSH7DB9I .section-10 path{fill:hsl(210, 100%, 76.2745098039%);}#mermaid-svg-xe8AUtU0jSH7DB9I .section-10 text{fill:black;}#mermaid-svg-xe8AUtU0jSH7DB9I .node-icon-10{font-size:40px;color:black;}#mermaid-svg-xe8AUtU0jSH7DB9I .section-edge-10{stroke:hsl(210, 100%, 76.2745098039%);}#mermaid-svg-xe8AUtU0jSH7DB9I .edge-depth-10{stroke-width:-16;}#mermaid-svg-xe8AUtU0jSH7DB9I .section-10 line{stroke:hsl(30, 100%, 86.2745098039%);stroke-width:3;}#mermaid-svg-xe8AUtU0jSH7DB9I .lineWrapper line{stroke:black;}#mermaid-svg-xe8AUtU0jSH7DB9I .disabled,#mermaid-svg-xe8AUtU0jSH7DB9I .disabled circle,#mermaid-svg-xe8AUtU0jSH7DB9I .disabled text{fill:lightgray;}#mermaid-svg-xe8AUtU0jSH7DB9I .disabled text{fill:#efefef;}#mermaid-svg-xe8AUtU0jSH7DB9I .section-root rect,#mermaid-svg-xe8AUtU0jSH7DB9I .section-root path,#mermaid-svg-xe8AUtU0jSH7DB9I .section-root circle{fill:hsl(240, 100%, 46.2745098039%);}#mermaid-svg-xe8AUtU0jSH7DB9I .section-root text{fill:#ffffff;}#mermaid-svg-xe8AUtU0jSH7DB9I .icon-container{height:100%;display:flex;justify-content:center;align-items:center;}#mermaid-svg-xe8AUtU0jSH7DB9I .edge{fill:none;}#mermaid-svg-xe8AUtU0jSH7DB9I .eventWrapper{filter:brightness(120%);}#mermaid-svg-xe8AUtU0jSH7DB9I :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} TxA (REPEATABLE READ) 开启事务 执行范围查询WHERE id BETWEEN10 AND 20 获得间隙锁 锁定 (10,20)之间的所有间隙 再次查询 结果集不变,幻读被阻止 提交事务 释放间隙锁 TxB (试图插入) 尝试插入 id=15 阻塞等待(因间隙锁未释放) 等待中 ... TxA提交后 插入成功,但此时已不影响TxA的一致性 事务并发与幻读防范(间隙锁作用)
MySQL 选择
REPEATABLE READ,核心是为了兼容早期的 STATEMENT 格式 Binlog 以保证主从一致性 。虽然现在有了更安全的ROW(基于行)格式 Binlog(推荐使用),但这个默认级别作为历史传承和"更安全"的默认配置,被保留了下来。
4. 现代视角下的权衡
既然 ROW 格式 Binlog 解决了主从不一致问题,为什么 MySQL 8.0 依然不改默认值?
- 兼容性与平滑升级:对于无数遗留系统,修改默认隔离级别可能引发未知的性能回退或死锁变化,作为基础软件,MySQL 必须保持高度的向下兼容。
- 业务语义更严谨 :对于金融、报表统计等需要事务内多次读取同一批数据的场景,
REPEATABLE READ直接提供了开箱即用的强一致性,减少了应用层处理"不可重复读"的代码负担。
但也要注意它的"副作用" :
由于间隙锁的存在,在高并发写入(尤其是高冲突的插入场景)下,REPEATABLE READ 比 READ COMMITTED 更容易产生死锁。因为间隙锁是"范围锁",两个事务很容易相互等待。
5. MySQL 的隔离级别决策逻辑
#mermaid-svg-Nf4Pqs5i2hLHYFte{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-Nf4Pqs5i2hLHYFte .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-Nf4Pqs5i2hLHYFte .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-Nf4Pqs5i2hLHYFte .error-icon{fill:#552222;}#mermaid-svg-Nf4Pqs5i2hLHYFte .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-Nf4Pqs5i2hLHYFte .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-Nf4Pqs5i2hLHYFte .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-Nf4Pqs5i2hLHYFte .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-Nf4Pqs5i2hLHYFte .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-Nf4Pqs5i2hLHYFte .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-Nf4Pqs5i2hLHYFte .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-Nf4Pqs5i2hLHYFte .marker{fill:#333333;stroke:#333333;}#mermaid-svg-Nf4Pqs5i2hLHYFte .marker.cross{stroke:#333333;}#mermaid-svg-Nf4Pqs5i2hLHYFte svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-Nf4Pqs5i2hLHYFte p{margin:0;}#mermaid-svg-Nf4Pqs5i2hLHYFte .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-Nf4Pqs5i2hLHYFte .cluster-label text{fill:#333;}#mermaid-svg-Nf4Pqs5i2hLHYFte .cluster-label span{color:#333;}#mermaid-svg-Nf4Pqs5i2hLHYFte .cluster-label span p{background-color:transparent;}#mermaid-svg-Nf4Pqs5i2hLHYFte .label text,#mermaid-svg-Nf4Pqs5i2hLHYFte span{fill:#333;color:#333;}#mermaid-svg-Nf4Pqs5i2hLHYFte .node rect,#mermaid-svg-Nf4Pqs5i2hLHYFte .node circle,#mermaid-svg-Nf4Pqs5i2hLHYFte .node ellipse,#mermaid-svg-Nf4Pqs5i2hLHYFte .node polygon,#mermaid-svg-Nf4Pqs5i2hLHYFte .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-Nf4Pqs5i2hLHYFte .rough-node .label text,#mermaid-svg-Nf4Pqs5i2hLHYFte .node .label text,#mermaid-svg-Nf4Pqs5i2hLHYFte .image-shape .label,#mermaid-svg-Nf4Pqs5i2hLHYFte .icon-shape .label{text-anchor:middle;}#mermaid-svg-Nf4Pqs5i2hLHYFte .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-Nf4Pqs5i2hLHYFte .rough-node .label,#mermaid-svg-Nf4Pqs5i2hLHYFte .node .label,#mermaid-svg-Nf4Pqs5i2hLHYFte .image-shape .label,#mermaid-svg-Nf4Pqs5i2hLHYFte .icon-shape .label{text-align:center;}#mermaid-svg-Nf4Pqs5i2hLHYFte .node.clickable{cursor:pointer;}#mermaid-svg-Nf4Pqs5i2hLHYFte .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-Nf4Pqs5i2hLHYFte .arrowheadPath{fill:#333333;}#mermaid-svg-Nf4Pqs5i2hLHYFte .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-Nf4Pqs5i2hLHYFte .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-Nf4Pqs5i2hLHYFte .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-Nf4Pqs5i2hLHYFte .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-Nf4Pqs5i2hLHYFte .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-Nf4Pqs5i2hLHYFte .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-Nf4Pqs5i2hLHYFte .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-Nf4Pqs5i2hLHYFte .cluster text{fill:#333;}#mermaid-svg-Nf4Pqs5i2hLHYFte .cluster span{color:#333;}#mermaid-svg-Nf4Pqs5i2hLHYFte div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-Nf4Pqs5i2hLHYFte .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-Nf4Pqs5i2hLHYFte rect.text{fill:none;stroke-width:0;}#mermaid-svg-Nf4Pqs5i2hLHYFte .icon-shape,#mermaid-svg-Nf4Pqs5i2hLHYFte .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-Nf4Pqs5i2hLHYFte .icon-shape p,#mermaid-svg-Nf4Pqs5i2hLHYFte .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-Nf4Pqs5i2hLHYFte .icon-shape .label rect,#mermaid-svg-Nf4Pqs5i2hLHYFte .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-Nf4Pqs5i2hLHYFte .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-Nf4Pqs5i2hLHYFte .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-Nf4Pqs5i2hLHYFte :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} READ UNCOMMITTED
READ COMMITTED
REPEATABLE READ
SERIALIZABLE
用户发起事务
当前隔离级别?
无锁读,性能极致
但如同走钢丝,易脏读
极少生产环境使用
Oracle/PostgreSQL默认
每次查询生成新快照
无间隙锁,并发高,但主从需配合ROW格式Binlog
MySQL默认
首次查询生成快照并复用
加间隙锁防幻读
主从兼容性好(STATEMENT/ROW均可)
代价:更高死锁风险
所有读加共享锁
完全串行化
性能最差,仅用于极端严格场景
结束事务
结论
"MySQL 默认是 REPEATABLE READ。这主要源于早期的 STATEMENT 模式 Binlog 复制,如果使用 READ COMMITTED 会导致主从数据不一致。虽然现在我们可以通过设置 binlog_format=ROW 并切换到 READ COMMITTED 来获得更高并发和更少死锁,但 InnoDB 为了向后兼容和提供更稳健的默认行为,在 8.0 版本中依然保留了 REPEATABLE READ 作为默认值。"