MVCC

143 阅读1分钟

MVCC

MySQL通过MVCC可以实现提交读RC(Read Committed)和可重复度RR(Repeatable Read)。

MySQL读取操作有两种:

  • 当前读:读取最新的数据,比如select时加锁。select lock in share mode

  • 快照度:读取快照数据。

实现方式

MySQL通过ReadView的方式实现。

MySQL的每条记录除了基本数据外,还有写入该条记录的事务id和回滚指针(用于数据回滚)。

image.png

image.png

image.png

image.png

上图中的db_trx_id就是记录中存放的事务Id。

基本原理

RC级别,在一个事务中,每个select语句都会生成一个ReadView,这样如果有其他事务提交了新数据,由于select时会生成新的ReadView,所以可以看到其他事务提交的新数据,导致了两次读取的数据不一样,出现不可重复读的问题。

RR级别,只要是在一个事务中,所有的select都共享该事务内的ReadView。因此,即使其他事务提交了新数据,由于ReadView没有重新生成,因此依然只能读取老的数据,解决了不可重复读的问题。也可以通过MVCC解决幻读的问题。

参考