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