MVCC的那些事儿

99 阅读2分钟

当前读:

读取的是数据库的最新数据

会对读取的数据加锁(保证其他并发事务不能修改当前读取的数据)

mysql数据库的默认隔离级别是:可重复读

开启两个事务A,B

事务A修改数据并提交事务,事务B使用select读取的还是事务B开始前的数据

事务B使用当前读 select * from temp lock in share mode; 可以读取到事务A修改后的数据

快照读:

就是普通的select读,不加锁,读取的是记录数据的可见版本,可能是历史数据,是非阻塞读

读已提交:每次select 都会生成一个快照读

可重复读:开启事务后的第一个select语句生成快照读,后边操作的都是这个快照数据

MVCC:

多版本并发控制,是指维护一个数据的多个版本,使得读写没有冲突,快照读为mysql实现MVCC提供了一个非阻塞 读功能,MVCC的具体实现还需要依赖数据库记录中的三个隐式字段(回滚指针,事务id,主键id),undo log,readView

1:隐式字段(回滚指针,事务id(自增),主键id)

2:undo log (解决事务的原子性,逻辑日志 作用:数据回滚,mvcc)

insert的时候事务提交后可被立即删除

update,delete的时候,在快照读的时候也需要,不会立即被删除

image.png

readview

RC(读已提交隔离级别)

每次select 都会生成生成readview

image.png

RR(可重复读隔离级别)

第一次select 生成readview之后复用这个readview

读未提交:有脏读,幻读,不可重复读

读已提交:有幻读,不可重复度

可重复读:有幻读问题

源自:MVCC MYSQL