Innodb中的快照读和当前读
一、前言
上篇文章记录了对MVCC的相关理解,其中有提到快照读。其实在MVCC并发控制中,读操作可以分为两类:快照读(snapshot read)和当前读(current read)
二、什么是快照读和当前读
- 快照读:读取的是记录的可见版本(有可能是历史版本),不加锁。
其实就是简单的select 操作。形如:select * from table where ?。 但还跟事务隔离级别有关。
- 当前读:读取的是记录的最新版本,并且当前读返回的记录都会加上锁,保证其他事务不会再并发修改这条记录。
其实就是特殊的读操作,比如插入、更新、删除属于当前读,需要加锁的也属于当前读。如下:
select * from table where ? lock in share mode -- 共享锁 (这里可能不同版本的mysql对应命令不一样)
select * from table where ? for update -- 排他锁
insert into table values(?)
update table set ? where ?
delete from table where ?
三、快照读的实现
四、当前读的实现
主要靠加锁(行记录锁+间隙锁)实现,保证其他事务不会再并发修改这条记录。
这就是本该拼搏的年纪,却想得太多,做得太少!