1. MySQL事务隔离级别深度解析
1.1 四种隔离级别特性对比
MySQL的事务隔离级别是数据库并发控制的核心机制,直接决定了事务之间的可见性规则。让我们通过一个银行转账的案例来理解这四种级别:
-
读未提交(Read Uncommitted):就像两个会计同时操作同一本账簿,A会计刚用铅笔修改了金额(未提交),B会计立刻就能看到这个修改。如果A最后决定擦掉修改(回滚),B之前看到的就是"脏"数据。实际开发中几乎不会使用这个级别。
-
读已提交(Read Committed):B会计必须等A会计用钢笔正式写完修改(提交)后才能看到新数据。但有个问题:B在上午和下午查看同一账户时,可能会看到不同的余额(因为A可能在中午修改并提交了数据)。
-
可重复读(Repeatable Read):B会计在早上打开账簿时会拍张快照,这一整天都只看这张快照,不管A会计怎么修改真实账簿。这是MySQL的默认级别,但要注意"幻读"问题——就像B发现早上账簿有100页,下午突然变成101页了(A新增了记录)。
-
串行化(Serializable):给账簿加上锁,一次只允许一个会计操作。最安全但效率最低,就像银行金库只能一个人进出。
1.2 InnoDB如何解决幻读问题
InnoDB通过组合拳解决幻读这个棘手问题:
-
MVCC快照读:每个事务启动时都会获得一个"数据快照"。对于普通SELECT查询,就像在看一张不会变的照片,自然看不到其他事务新增的数据。
-
Next-Key Lock当前读:当执行SELECT...FOR UPDATE这类"当前读"时,InnoDB会给查到的记录加上两种锁:
- Record Lock:锁住具体记录(如锁住id=5的行)
- Gap Lock:锁住记录之间的间隙(如防止在id=5和id=10之间插入新数据)
实际案例:假设有个会议室预定系统,事务A查询"11:00-12:00未被预定的会议室"(返回3间)。如果没有间隙锁,事务B可能在这期间插入新的预定记录,导致事务A后续操作出现幻读。通过锁定时间范围的间隙,就能彻底避免这个问题。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. MySQL索引原理与优化实践
2.1 B+树索引的智慧
为什么MySQL选择B+树
