文章目录
一、MVCC是什么
二、什么是当前读和快照读?
在学习MVCC多版本并发控制之前,我们必须先了解一下,什么是MySQL InnoDB下的当前读和快照读?
当前读
快照读
说白了MVCC就是为了实现读-写冲突不加锁,而这个读指的就是快照读, 而非当前读,当前读实际上是一种加锁的操作,是悲观锁的实现
三、MVCC具体实现
**
1.隐士字段:
DB_TRX_ID
6byte,最近修改(修改/插入)事务ID:记录创建这条记录/最后一次修改该记录的事务ID
DB_ROLL_PTR
7byte,回滚指针,指向这条记录的上一个版本(存储于rollback segment里)
DB_ROW_ID
6byte,隐含的自增ID(隐藏主键),如果数据表没有主键,InnoDB会自动以DB_ROW_ID产生一个聚簇索引
实际还有一个删除flag隐藏字段, 既记录被更新或删除并不代表真的删除,而是删除flag变了
**
**
2.undo日志
insert undo log
代表事务在insert新记录时产生的undo log, 只在事务回滚时需要,并且在事务提交后可以被立即丢弃
update undo log
事务在进行update或delete时产生的undo log; 不仅在事务回滚时需要,在快照读时也需要;所以不能随便删除,只有在快速读或事务回滚不涉及该日志时,对应的日志才会被purge线程统一清除
**
undo日志其实就是旧版本的数据,每次都修改的数据都存到undo里面,通过回滚指针连接,回滚指针指向上一个旧版本的数据。事务id同时也会更改,id自增+1。
3.Read View 读视图
Read View 是在快照读里产生的。利用Read View 可以判断事务是否可以访问某个版本的数据,四个参数和四个判断条件
参数 | 作用 |
---|---|
m_ids | 生成 Read View 时,当前活跃的事务id (指的是那些没有commit的事务) 列表 |
min_trx_id | m_ids中最小值,当前活跃的事务id最小值 |
max_trx_id | 生成 Read View 时,应该分给下一个事务的id值 |
creator_trx_id | 生成 Read View 时的事务id |
条件 | 结果 |
---|---|
trx_id == creator_trx_id | 可以访问这个版本 |
trx_id < min_trx_id | 可以访问这个版本 |
trx_id > max_trx_id | 不可以访问 |
min_trx_id =< trx_id <= max_rx_id | 同时不在m_ids列表内,可以访问 |
1.读已提交是 , 以select为单位 生成快照。俩个select 中间事务commit, 前后俩个快照不一致,会产生不可重复读和幻读。
2.可重复读 ,以事务为单位 生成快照。前后生成快照 是一致的,只会产生幻读。
总结
提示:这里对文章进行总结:
例如:以上就是今天要讲的内容,本文仅仅简单介绍了pandas的使用,而pandas提供了大量能使我们快速便捷地处理数据的函数和方法。