查看: 4084|回复: 11

问MVCC是如何实现读不阻塞写的?

[复制链接]
论坛徽章:
4
2014年新春福章
日期:2014-02-18 16:49:31马上有钱
日期:2014-02-18 16:49:312014年新春福章
日期:2014-04-01 18:10:02优秀写手
日期:2014-10-17 06:00:14
发表于 2014-9-30 10:59 | 显示全部楼层 |阅读模式
写不阻塞读可以简单理解为:
     一个update语句对记录A操作时,另一个select语句可以从undo空间里读取记录A之前快照,所以写不阻塞读;

那读不阻塞写如何实现的呢?
论坛徽章:
3
懒羊羊
日期:2015-03-04 14:52:112015年新春福章
日期:2015-03-06 11:58:18蒙奇·D·路飞
日期:2017-09-21 11:23:37
发表于 2014-9-30 11:57 | 显示全部楼层
就是多版本啊,回滚段保存旧的数据

使用道具 举报

回复
认证徽章
论坛徽章:
0
发表于 2014-9-30 11:57 | 显示全部楼层
你说的是oracle数据库吗?读不能改变表中的数据应该每个线程都可以连接都可以读取,写会改变数据

使用道具 举报

回复
认证徽章
论坛徽章:
5
ITPUB十周年纪念徽章
日期:2011-11-01 16:26:592014年新春福章
日期:2014-02-18 16:44:08马上有对象
日期:2014-02-18 16:44:082015年新春福章
日期:2015-03-04 14:53:162015年新春福章
日期:2015-03-06 11:58:39
发表于 2014-9-30 12:02 | 显示全部楼层
UNDO回滚段

使用道具 举报

回复
论坛徽章:
4
2014年新春福章
日期:2014-02-18 16:49:31马上有钱
日期:2014-02-18 16:49:312014年新春福章
日期:2014-04-01 18:10:02优秀写手
日期:2014-10-17 06:00:14
 楼主| 发表于 2014-9-30 12:11 | 显示全部楼层
lujinke 发表于 2014-9-30 11:57
就是多版本啊,回滚段保存旧的数据

读的是旧数据,所以写可以操作当前数据?所以读不阻塞写?

使用道具 举报

回复
论坛徽章:
4
2014年新春福章
日期:2014-02-18 16:49:31马上有钱
日期:2014-02-18 16:49:312014年新春福章
日期:2014-04-01 18:10:02优秀写手
日期:2014-10-17 06:00:14
 楼主| 发表于 2014-9-30 12:12 | 显示全部楼层
z597011036 发表于 2014-9-30 11:57
你说的是oracle数据库吗?读不能改变表中的数据应该每个线程都可以连接都可以读取,写会改变数据

我说的是innodb,应该和oracle的MVCC一样吧?

使用道具 举报

回复
论坛徽章:
5
复活蛋
日期:2012-11-02 16:27:37灰彻蛋
日期:2013-01-27 17:08:112013年新春福章
日期:2013-02-25 14:51:24复活蛋
日期:2013-05-27 15:29:10优秀写手
日期:2014-07-01 06:00:12
发表于 2014-10-5 09:39 | 显示全部楼层
读和写的版本不一样,所以读不阻塞写,写的是当前版本

使用道具 举报

回复
论坛徽章:
4
2014年新春福章
日期:2014-02-18 16:49:31马上有钱
日期:2014-02-18 16:49:312014年新春福章
日期:2014-04-01 18:10:02优秀写手
日期:2014-10-17 06:00:14
 楼主| 发表于 2014-10-8 10:26 | 显示全部楼层
digdeep126 发表于 2014-10-5 09:39
读和写的版本不一样,所以读不阻塞写,写的是当前版本

谢谢!

使用道具 举报

回复
认证徽章
论坛徽章:
27
优秀写手
日期:2013-12-18 09:29:09ITPUB季度 技术新星
日期:2012-08-15 14:50:13嫦娥
日期:2013-03-04 09:47:05数据库板块每日发贴之星
日期:2011-09-08 01:01:01数据库板块每日发贴之星
日期:2011-09-11 01:01:01数据库板块每日发贴之星
日期:2011-09-10 01:01:02数据库板块每日发贴之星
日期:2011-09-09 01:01:01ITPUB十周年纪念徽章
日期:2011-11-01 16:26:59ITPUB 11周年纪念徽章
日期:2012-09-28 17:34:422013年新春福章
日期:2013-03-04 09:50:49
发表于 2014-10-8 13:49 | 显示全部楼层
本帖最后由 mchdba 于 2014-10-8 14:49 编辑

4.1CNR原理解析
一致性的非锁定行读(consistent nonlocking read,简称CNR)是指InnoDB存储引擎通过行多版本控制(multiversioning)的方式来读取当前执行时间数据库中运行的数据。如果读取的行正在执行deleteupdate操作,这时读取操作不会因此而会等待行上锁的释放,相反,InnoDB存储引擎会去读取行的一个快照数据,如下图所示:
file:///C:/Users/ADMINI~1/AppData/Local/Temp/msohtmlclip1/01/clip_image002.jpg

非锁定读,是因为不需要等待访问的行上X锁的释放,快照数据是指该行之前版本的数据,该实现是通过Undo段来实现,而Undo用来在事务中回滚数据,因此快照本身是没有额外的开销,此外读取快照是不需要上锁的,因为没有必要对历史的数据进行修改。


非锁定读大大提高了数据读取的并发性,在InnoDB存储引擎默认设置下,这是默认的读取方式,既读取不会占用和等待表上的锁。但是不同事务隔离级别下,读取的方式不同,不是每一个事务隔离级别下的都是一致性读。同样,即使都是使用一致性读,但是对于快照数据的定义也不相同。


快照数据其实就是当前数据之前的历史版本,可能有多个版本。如上图所示,一个行可能不止有一个快照数据。我们称这种技术为行多版本技术。由此带来的并发控制,称之为多版本并发控制(Multi Version Concurrency ControlMVCC)。


Read CommittedRepeatable Read模式下,innodb存储引擎使用默认的非锁定一致读。在Read Committed隔离级别下,对于快照数据,非一致性读总是读取被锁定行的最新一份快照数据;而在Repeatable Read隔离级别下,对于快照数据,非一致性读总是读取事务开始时的行数据版本。

使用道具 举报

回复
论坛徽章:
4
2014年新春福章
日期:2014-02-18 16:49:31马上有钱
日期:2014-02-18 16:49:312014年新春福章
日期:2014-04-01 18:10:02优秀写手
日期:2014-10-17 06:00:14
 楼主| 发表于 2014-10-11 09:15 | 显示全部楼层
mchdba 发表于 2014-10-8 13:49
4.1,CNR原理解析一致性的非锁定行读(consistent nonlocking read,简称CNR)是指InnoDB存储引擎通过行多版 ...

谢谢!

使用道具 举报

回复

您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

SACC2019中国系统架构师大会

【数字转型 架构演进】SACC2019中国系统架构师大会,7折限时优惠重磅来袭!
2019年10月31日~11月2日第11届中国系统架构师大会(SACC2019)将在北京隆重召开。四大主线并行的演讲模式,1个主会场、20个技术专场、超千人参与的会议规模,100+来自互联网、金融、制造业、电商等领域的嘉宾阵容,将为广大参会者提供一场最具价值的技术交流盛会。

限时七折期:2019年8月31日前


----------------------------------------

大会官网>>
TOP技术积分榜 社区积分榜 徽章 团队 统计 知识索引树 积分竞拍 文本模式 帮助
  ITPUB首页 | ITPUB论坛 | 数据库技术 | 企业信息化 | 开发技术 | 微软技术 | 软件工程与项目管理 | IBM技术园地 | 行业纵向讨论 | IT招聘 | IT文档
  ChinaUnix | ChinaUnix博客 | ChinaUnix论坛
CopyRight 1999-2011 itpub.net All Right Reserved. 北京盛拓优讯信息技术有限公司版权所有 联系我们 
京ICP备09055130号-4  北京市公安局海淀分局网监中心备案编号:11010802021510 广播电视节目制作经营许可证:编号(京)字第1149号
  
快速回复 返回顶部 返回列表