背景介绍
mvcc:事物多版本并发控制,为了读取数据时不加锁提高读取性能和并发性的一种手段。在快照读的基础上,通过undo log版本链和read view实现的。
RR:读已提交隔离级别,只允许当前事物只能读取到其他事物已经提交的数据。不会产生脏读,但会有不可重复读或幻读的问题。
RC:可重复读隔离级别,在同一个事物内,多次读取同一行数据,结果一致。不会产生脏读、不可重复读,但是会有幻读的问题。
应用实践
mvcc是通过undo log版本链和read view实现的。同时,每一个行数据有隐藏的三个字段,当前行的事物ID、回滚指针、行ID(用于无主键或唯一键时,生成聚簇索引)。
read view: 包含三个字段
m_ids: 当前活跃的事物,即已开启未提交的事物
min_m_id:活跃事物中的最小事物id
max_m_id:活跃事物中最大事物id + 1
RC
RC隔离级别,每一次select快照读都会生成新的read view,所以mvcc无法解决不可重复读和幻读的问题。
id | order_id | name | amount | trx_id | roll_pointer |
1 | 2001 | 张三 | 1000 | 0 | null |
RR
RR隔离级别,每一次select快照读都会依赖第一次所生成的read view,但是如果中间存在当前读且当前读覆盖了之前的事物,就会出现不可重复读或幻读,所以mvcc只能部分解决不可重复读和幻读的问题。
id | order_id | name | amount | trx_id | roll_pointer |
1 | 2001 | 张三 | 1000 | 0 | null |
结论
MVCC不能解决RC隔离级别下的不可重复读和幻读,可以部分解决RR隔离级别下不可重复读和幻读。
如果要完全解决不可重复读和幻读,可以加行锁和临间锁。