一、read view四个字段
create_trx_id:创建该read view的事务的事务id
m_ids:创建read view时,当前数据库中的活跃事务(指启动但还没提交的事务)
min_trx_id:m_ids的最小值
max_trx_id:创建read view后,下一个事务的id

二、聚簇索引的隐藏列
trx_id:最近一次改动该聚簇索引记录的事务id
roll_pointer:指向旧版本记录,形成版本链

三、read view在mvcc中工作原理
1.如果trx_id<min_trx_id,说明已经提交了,该版本对该事务可见
2.如果trx_id>max_trx_id,说明该版本在创建read view后才生成的,所以该版本对该事务不可见
3.如果min_trx_id<trx_id<max_trx_id:在m_ids中,说明未提交,不可见;不在m_ids中,说明已提交,可见

四、四种隔离级别实现
1.读未提交:直接读取最新数据即可
2.读提交:每次读取数据都生成新的read view
3.可重复读:在启动事务时生成一个read view,整个事务期间都在用这个read view
4.串行化:通过加读写锁来避免并行访问

五、幻读是怎么解决的
1、针对快照读(普通 select 语句):是通过 MVCC 方式解决了幻读
2、针对当前读(select ... for update或执行update、insert、delete这些语句执行前都会查询最新版本的数据时):当执行select... for update语句的时候,会加上next-key lock(间隙锁+记录锁的组合),如果有其他事务在next-keylock锁范围内插入了一条记录,那么这个插入语句就会被阻塞,无法成功插入,所以就很好了避免幻读问题。

posted on 2024-03-11 11:46  孜孜不倦fly  阅读(14)  评论(0编辑  收藏  举报