mysql幻读怎么处理 mysql innodb 幻读

Mysql 幻读&Next Key Lock详解幻读的定义是指,一个事务开启后,执行前后两次查询,两次查询中出现了新的数据,幻读仅针对数据的新增 。
比如: 表t中,id为主键,目前有数据1,5,10,20四条 。
开始一个事务A,前后两次执行 select * from t where id10 for update;
开启一个事务B,在事务A第二次执行查询前,执行insert into t values( 2,...); 并提交事务(请暂时忽略这里能否成功执行?。?。
此时在RC、RR隔离级别下都会导致事务A第二次查询能够查询到 事务B新增的数据 id = 2 。
RC级别下能够看到不同结果就不做解释了 。
对于RR隔离级别下,有了MVCC版本控制为什么还能读取到不同的结果呢?
这里要归功于 "for update" 。
"for update" 会将快照读变为当前读 , 在当前读场景中,会自动读取最新的数据 , 而非快照数据 。
分析一下,锁与当前读关系 。了解什么情况下会加锁 。了解 意向锁、共享锁、排它锁区别及各自在什么情况下使用 。
行锁的概念都清楚,这里就不做补充了 。
间隙锁实际上是指一个区间 。
我们都知道,InnoDB 在RR事务隔离级别下解决幻读问题就是通过Next Key Lock (间隙锁+行锁)来实现的 。而且 , 很多地方也有提到,如果对于读一致性要求不高的场景可以考虑使用RC隔离级别,允许幻读的发生 。
还是上边说的那个实例,略微改动:
比如: 表t中,id为主键 , 目前有数据1,5,10,20四条 。
开始一个事务A , 前后三次分别执行
开启一个事务B,在事务A执行update前,执行insert into t values( 2,...); 并提交事务 。
此时我们知道,事务A中第二次查询能够查到 事务B新增的数据,也就是产生了幻读 。那么 , 按照SQL执行的顺序来说,事务B
关于MySQL的幻读问题,看这一篇就够了什么是幻读?
幻读指的是一个事务在前后两次查询同一个范围的时候,后一次查询看到了前一次查询没有看到的行 。
首先快照读是不存在幻读的,只有当前读(实时读)才存在幻读的问题 。
幻读有什么问题?
select ...for update语句就是将相应的数据行锁?。?但是如果存在幻读,就把for update的语义破坏了 。
如何解决幻读?
产生幻读的原因是,行锁只能锁住行,但是新插入记录这个动作 , 要更新的是记录之间的“间隙” 。因此,为了解决幻读问题,InnoDB只好引入新的锁,也就是间隙锁(Gap Lock) 。间隙锁和行锁合称 next-key lock , 每个next-key lock是前开后闭区间。
总结
正确理解MYSQL的幻读一、定义
1、幻读MYSQL官方叫法是Phantom Rowsmysql幻读怎么处理,意为鬼影行或者幻影行,请看官方定义:
The so-called phantom problem occurs within a transaction when the same query produces different sets of rows at different times. For example, if a [ SELECT ] is executed twice, but returns a row the second time that was not returned the first time, the row is a “phantom” row.
翻译一下:
所谓的幻影行问题是指,在同一个事务中,同样的查询语句执行多次,得到mysql幻读怎么处理了不同的行结果集 。
例如,如果同一个SELECT语句执行了两次,第二次执行的时候比第一次执行时多出一行 , 则该行就是所谓的幻影行 。
2、幻读与不可重复读的区别
从官方的定义来看 , 幻读的定义侧重于多条记录,就是记录条数的变化,而不可重复读侧重于单条记录数据的变化,这样区分原因在于解决幻读需要范围锁,解决不可重复读只需要单条记录加锁

推荐阅读