MVCC
MySQL通过MVCC可以实现提交读RC(Read Committed)和可重复度RR(Repeatable Read)。
MySQL读取操作有两种:
-
当前读:读取最新的数据,比如select时加锁。
select lock in share mode -
快照度:读取快照数据。
实现方式
MySQL通过ReadView的方式实现。
MySQL的每条记录除了基本数据外,还有写入该条记录的事务id和回滚指针(用于数据回滚)。
上图中的db_trx_id就是记录中存放的事务Id。
基本原理
RC级别,在一个事务中,每个select语句都会生成一个ReadView,这样如果有其他事务提交了新数据,由于select时会生成新的ReadView,所以可以看到其他事务提交的新数据,导致了两次读取的数据不一样,出现不可重复读的问题。
RR级别,只要是在一个事务中,所有的select都共享该事务内的ReadView。因此,即使其他事务提交了新数据,由于ReadView没有重新生成,因此依然只能读取老的数据,解决了不可重复读的问题。也可以通过MVCC解决幻读的问题。