2024-11-09
版权声明:本文为博主付费文章,严禁任何形式的转载和摘抄,维权必究。 本文链接:https://www.skjava.com/mianshi/baodian/detail/7469586084

回答

在 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 以及它的实现原理?