0
点赞
收藏
分享

微信扫一扫

mysql MVCC并发版本控制解析

快乐小码农 2022-03-30 阅读 68
java

文章目录


一、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_idm_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提供了大量能使我们快速便捷地处理数据的函数和方法。

举报

相关推荐

0 条评论