MySQL5.7 MVCC原理分析与调试简介:
大家好mysql数据库怎么调试,mysql数据库怎么调试我是xpmysql数据库怎么调试,我又诈尸mysql数据库怎么调试了
mvcc ,想必大家都不陌生,每个Java程序员都或多或少的了解过,不过不知道大家都是怎么学习的,是不是简单的百度一下呢?下面 , 我来带大家装个13,调试 mvcc。咳,不是源码哈,但有那味了 。
开卷开卷 。
首先介绍一下 mvcc 的字面意思,全称: Multiversion Concurrency Control , 翻译下来就是多版本并发控制技术 。
脏读、 不可重复读 、幻读的概念就不多啰嗦了 , mvcc具体的含义也不多啰嗦了,可以自行百度 。mvcc 解决了脏读、 不可重复读、部分幻读,包含了3个重要成分:
undo log作用:
在数据修改的时候,不仅记录了redo log,还记录了undo log。但是 不同于redo log,undo log 是逻辑日志 。简单理解成, delete的时候 , undo log会出现一条insert,update的时候 , undo log会出现一条旧数据 , 用来事务失败之后的回滚 。
3个隐式字段:
Read View:
好了 , 理论讲完了 , 让我们嗨起来 。
嗨之前,有一个情况单独说一下:
可以看到,此时的trx_id非常大,这是因为此时是只读事务 。对于只读事务,InnoDB 并不会分配 trx_id,只有发生dml才会分配 。这样有2个好处:
当commit了之后 , 我们使用SHOW ENGINE INNODB STATUS查看:
可以看到,显示该事务并没有开始 。
好,回到正轨,相信大家都知道 , 视图可见性判断(不知道的先百度mvcc):
整体是这样的:
第一步我们以 38488 为开始值,把 name 更新成 111,并且 commit
第二步以 38490 把 name 更新成 222,333 , 但是不 commit
当 38490 第一次修改为 222 的时候,数据结构大致是这样的:
使用 SHOW ENGINE INNODB STATUS 侧面验证:
当 38490 第二次修改为 333 的时候,数据结构大致是这样的:
使用 SHOW ENGINE INNODB STATUS 侧面验证:
第三步以 38491 去查询 , 此时生成的 m_ids 应该是 [348490,38491]
使用 SHOW ENGINE INNODB STATUS 侧面验证:
此时 ReadView 的几个属性值为:
接下来我们来验证结论:
1:不用验证,当前事务修改的肯定自己可见
2: 38491查询id=1的记录,name为111
38488348490 , 所以111可见
3:不用验证,38492是下个事务的id,还没生成呢,当前事务,肯定看不见下个事务修改的值
4:我们先把38491commit,把id为20的name更新成111
然后再开一个事务38496:
此时查id为20 , 是可见的
m_ids:[348490,38496],因为38491已经commit了,所以m_ids没有 。此时的38491在m_ids之间 , 但是在m_ids里面找不到,所以可见 。
好了,愉快的装13结束了,兄弟们 , 下次见 。
如何在Windows下编译或调试MySQL准备工作:
安装一个编译器,推荐Microsoft visual studio 2008吧
另外需要装:
GNU Bison for Windows :
CMake 2.6.0 or later:
开始编译:
这里以mysql-5.1.38的源码编译为例:
mysql-5.1.38的代码下载可以到mysql官方网站下载 , 具体怎么下载不在说明 。
打开一个cmd窗口:
输入:
cscript //H:CScript
然后:
cd /path/mysql-5.1.38
win\configure WITH_INNOBASE_STORAGE_ENGINE __NT__
win\build-vs9.bat
到此我们将会创建一个mysql.sln 的工程文件,如果对想学习代码的朋友,到此即可以,然后可以用Microsoft visual studio 2008打开这个文件就可以查看相应的代码了 。
推荐阅读
- html5手机布局,html5 布局
- 固态硬盘怎么每天写入暴增,固态硬盘如何使用才能增加寿命
- 和小朋友玩的体育游戏中班,体育游戏小朋友教案
- python中插值函数 python scipy 插值
- js所有全局方法,js中的全局变量
- 怎么给微信公众号加编辑器,微信公公众号编辑
- 无花果是什么作用视频,无花果果的功效与作用及食用方法
- 包含vb.net显示变量值的词条
- flutter路由动画,flutter路由切换动画