”可重复读“隔离级别下MySQL是如何解决幻读问题的

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

什么是幻读?

幻读,在一个事务里面的两次相同过滤条件的读取,读取的数据数条数不一致。(注意和不可重复读的区别)

MySQL的默认隔离级别是RR,但是却没有幻读的问题,那他是怎么解决的呢?答案就是Gap锁。

隔离级别 脏读 不可重复读 幻读
Read Uncommitted 可能 可能 可能
Read Committed 不可能 可能 可能
Repeat Read 不可能 不可能 可能(MySQLInnoDB不可能)
串行化 不可能 不可能 不可能

MySQL的Gap锁

MySQL的共享锁(读锁)和排它锁(写锁)大家应该都比较熟悉了,那gap锁是什么东西呢?

select *from user where age>0 and age<10 for update;
或者
select *from user where age>0 and age<10;
或者
select *from user where age>0 and age<10 in share mode;

举个栗子,我们在一个事务中执行上述的SQL语句,数据库中只有age=1,age=4,age=7,age=8 这三条满足条件的记录,那么gap锁会加到age=2,3,5,6,9上面,如果另外一个事务里面想insert age=2,3,5,6,9 是会被阻塞的,因为第一个事务拿到了gap锁。

 

MySql中如果是快照读,那么是通过MVCC(多版本控制)来避免幻读.

如果是当前读,那么是通过gap锁来避免幻读

转载于:https://my.oschina.net/u/4129361/blog/3048941

你可能感兴趣的:(”可重复读“隔离级别下MySQL是如何解决幻读问题的)