回答
在 MySQL 中,主要通过**多版本并发控制(MVCC)和临键锁(next-key lock)**机制来解决幻读现象。
一、幻读 & 不可重复读
幻读指在一个事务中,同一条 SELECT 语句在不同时刻执行,得到不同的结果集的现象。比如由于其他事务的插入或删除操作,导致后面查询的结果集中出现了之前不存在的记录(幻影行)。数据库还有一个和幻读类似的概念不可重复读。两者的区别在于:
- 幻读强调的是存不存在的问题,原来不存在的行记录,现在存在了,则是幻读。
- 不可重复读强调的是变没变化的问题,行记录字段原来是 A,现在却变为了 B,则为不可重复读。
二、MVCC 机制
MySQL 默认的隔离级别是可重复读(RR),而 MySQL 的可重复读是通过快照读来实现。快照读指在一个事务执行期间基于事务 ID 只能读取到在它之前的快照数据,其核心是 MVCC 机制。快照读不会感知到其他事务插入的数据,也就解决了幻读。如下不加锁的SELECT
查询属于快照读:
SELECT * FROM t_user WHERE id BETWEEN 10 AND 20;
更多 MySQL MVCC 内容:什么是 MVCC 以及它的实现原理?