什么是幻读?
幻读,在一个事务里面的两次相同过滤条件的读取,读取的数据数条数不一致。(注意和不可重复读的区别)
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://blog.csdn.net/weixin_34378045/article/details/92427934