实现机制: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之内说明还没提交,则不可见
  如果不在则说明该事务提交执行结束,可见
 

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐