脏读
事务a,事务b,b读到了a刚修改未提交的数据
不可重复读
针对同一行记录,两次读到的结果不一致
(范围是一行)
幻读
范围比不可重复读大很多,是表的范围,事务a第一次查的时候不存在,后面事务b插入提交,事务a第二次查的时候又发现多了数据,仿佛存在幻影
脏读是什么措施都没有,MVCC解决的主要是RC和RR
RC是读已提交,每次查询新建一个ReadView,通过MVCC规则确定访问数据的历史版本
RR是可重复读,只有事务第一次Select才会新建ReadView,后续查询除非是本事务修改或者显式当前读(Select * From 。。for Update/delete/insert),否则查询结果直接复用前面的ReadView,直接返回旧的读取结果。
MVCC本质上是无锁实现,乐观锁思想,提高了并发能力,比锁的效率要高很多