LBCC
在读取数据前,对其加锁,阻止其他事务对数据进行修改
读多写少的情况会极大的影响操作数据的效率
MVCC
生成一个数据请求时间点的一致性数据快照,并用这个快照来提供一定级别的的一致性读取
建立数据快照,同一个事物无论查多少次都是相同的数据(第一层)
一个事务能看到的数据版本:1、第一次查询之前已经提交的事务的修改 2、本事务的修改(第二层)
一个事务不能看到的数据版本:1、本事务第一次查询之后创建的事务(事务ID比我的事务ID大)2、未提交的事务修改
利用隐藏字段实现
Read View 一致性识图(第三层)
m_ids{} 列表,当前系统的事务ID
min_trx_id m_ids最小值
max_trx_id 系统分配给下一个事务的ID
creator_trx_id 生成Read View事务的事务ID
判断规则
1、从事务最早的数据开始判断(在undo log)
2、数据版本事务ID等于自己的ID,本事务修改,可以访问
3、数据版本的事务ID小于未提交事务最小的ID,说明在生成Read View已经提交,可以访问
4、数据版本的事务ID 大于 下一个事务的ID,这个版本是Read View之后才开启的事务,不能访问
5、数据版本的事务ID在最小事务ID跟最大事务ID之间,看看是否在当前事务列表中,如果在,不可以,如果不在,可以
6、如果当前版本不可见,则到undo log链中找到下一个版本
RR的Read View是事务第一次查询建立的(解决幻读)
RC的Read View是事务每次查询建立的(没解决幻读)