本文共 488 字,大约阅读时间需要 1 分钟。
InnoDB在REPEATABLE-READ的隔离级别中消灭了幻读,在标准的隔离级别中,REPEATABLE-READ的隔离级别
是允许幻读的,咋一看mysql的隔离级别更完善,但是实际上mysql之所以在REPEATABLE-READ隔离级别中消灭幻读
是因为需要填历史版本的坑(为了确保statement模式replicate的主从一致性)
从gap lock的字面意思上看就是"间隙锁",什么是间隙锁呢?
在t3表中有如下数据:
当我们在一个事物中执行
select * from t3 where a=27 for update;
当在另一个事物中执行
insert into t3 values(27);
时,此时插入会被阻塞,这是标准的阻止幻读的情况,但是由于mysql实现消灭幻读的实现非常粗糙,是根据索引实现的,
索引mysql必须锁住上面23~30之间所有数据的插入。
所以当执行
insert into t3 values(28);
或者
insert into t3 values(24);时,
sql语句都会被阻塞,这样就一不注意就是出现很大的问题了。
转载地址:http://qvdfb.baihongyu.com/