【MYSQL】当前读和快照读

前言

复习下隔离级别:
1、读未提交:一个事务还没提交时,它做的变更就能被别的事务看到。
2、读提交:一个事务提交之后,它做的变更会被其他事务看到
3、可重复读:一个事务执行过程中看到的数据,总是跟这个事务在启动时看到的数据是一致的。未提交的数据对其他事务不可见
4、串行化:对于同一行记录,“写”会加“写锁”,“读”会加“读锁”。当出现读写锁冲突的时候,后访问的事务必须等前一个事务执行完成,才能继续执行

当前读 & 快照读

表记录有两种读取方式。
1、快照读:读取的是快照版本。普通的SELECT就是快照读。通过mvcc来进行并发控制的,不用加锁。(不加锁)
2、当前读:读取的是最新版本。UPDATE、DELETE、INSERT、SELECT … LOCK IN SHARE MODE、SELECT … FOR UPDATE是当前读。(加锁)

快照读情况下,InnoDB通过mvcc机制避免了幻读现象。而mvcc机制无法避免当前读情况下出现的幻读现象。因为当前读每次读取的都是最新数据,这时如果两次查询中间有其它事务插入数据,就会产生幻读。

MySQL是如何避免幻读
在快照读情况下,MySQL通过mvcc来避免幻读。
在当前读情况下,MySQL通过next-key来避免幻读(加行锁和间隙锁来实现的)。
next-key包括两部分:行锁和间隙锁。行锁是加在索引上的锁,间隙锁是加在索引之间的。

Serializable隔离级别也可以避免幻读,会锁住整张表,并发性极低,一般不会使用。

在可重复读下,快照读和当前读怎么实现

1、快照读是通过MVCC(多版本控制)和undo log来实现的
2、当前读是通过加record lock(记录锁)和gap lock(间隙锁)来实现的。如果需要实时显示数据,还是需要通过加锁来实现。这个时候会使用next-key技术来实现。

在mysql中,提供了两种事务隔离技术,第一个是mvcc,第二个是next-key技术(record lock行锁 + gap lock间隙锁)。
不加lock inshare mode之类的就使用mvcc。否则使用next-key。
mvcc的优势是不加锁,并发性高。缺点是不是实时数据。
next-key的优势是获取实时数据,但是需要加锁。

快照是什么时候生成的

1、在读未提交隔离级别下,快照是什么时候生成的?
没有快照,因为不需要,怎么读都读到最新的。不管是否提交

2、在读已提交隔离级别下,快照是什么时候生成的?
SQL语句开始执行的时候。

3、在可重复读隔离级别下,快照是什么时候生成的?
事务开始的时候(可能会有很多条select SQL语句执行,快照生命周期是到事务结束的时候)

4、在串行化隔离级别下,快照是什么时候生成的?
“写”会加“写锁”,“读”会加“读锁”,读的的数据都是当前最新的数据(没有快照,当前读)

怎么知道当前执行语句是当前读还是快照读

1、在默认隔离级别(可重复读)下,select语句默认是快照读

select * from table id = 1;

2、select语句加锁是当前读

 共享锁
select * from table id = 1 lock in share mode;

排他锁
select * from table where id = 1 for update;

3、update、insert、delete 语句当前读(行锁)

update table set a = 1;
delete from table where id = 1;
inert into table ...
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值