mysql可重复读原理

实现机制:mvcc+undo log日志

mvcc:多版本并发控制:
1.mvcc依赖于表的两个隐藏列实现如果没有主键,innodb默认会生成一个隐藏列作为主键
2.DATA_TRX_ID:最新更新这条数据的事务id,6字节
   DATA_ROLL_PTR:存放指向上一个事务版本的指针,占7字节 ,版本链依赖于这个字段
   DB_ROW_ID:主键
3.版本链:
  单链表,主要用于:
 1.事务的回滚
 2.多版本控制,配合read view实现事务的隔离
  版本链其实真实是不存在的由表中的隐藏字段data_roll_ptr和undo log动态计算出来
 4.Read View
   包含四个重要属性:
  m_ids:保存在生成read view时当前系统中所有活跃的事务id,及还没有提交的
  min_trx_id:保存在生成read view时当前系统中活跃的最小的事务id
  max_trx_id:保存在生成read view时当前系统中活跃的最大的事务id
  creator_trx_id:保存生成该read view的事务id
举例:
事务11启动时这四个属性的值:m_ids=[11],min_trx_id=11,max_trx_id=12,creator_trx_id=10
事务12启动后这四个属性的值:m_ids=[11,12],min_trx_id=11,max_trx_id=13,creator_trx_id=10

用于:
select语句查询时数据的可见性就是通过这四个属性+版本链计算出来的
1.被访问的数据的事务id与 rv中的create_trx_id相同,意味着查询自己修改过的记录,是可见的
2.被访问的数据的事务id 小于rv 中的min_trx_id表示该数据已经被提交,这个版本对当前事务是可见的
3.被访问的数据的事务id 小于rv 中的max_trx_id表示该版本的事务还未开启,这个版本对当前事务是不可见的
4.被访问的数据的事务id在min_trx_id和max_trx_id之间,则需要再次判断
  如果id在m_ids之内说明还没提交,则不可见
  如果不在则说明该事务提交执行结束,可见
 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值