宝宝肌张力高会有什么影响| 舌头口腔溃疡是什么原因引起的| 榴莲不能与什么食物一起吃| 不寐病属于什么病症| baron是什么意思| 爽约什么意思| 口干舌燥吃点什么药| 斜杠青年什么意思| 吃什么药可以提高性功能| 转氨酶高吃什么好得快| 女人梦见蛇缠身是什么预兆| 双肾尿酸盐结晶是什么意思| 1990年是什么年| 性冷淡什么意思| 双顶径是什么| 一什么雨衣| 征字五行属什么| 重症医学科是干什么的| 类风湿是什么病| 尿频尿急用什么药| usim卡是什么卡| vg是什么意思| 入职体检前要注意什么| 下面痒吃什么消炎药| 妇科病有什么症状| 一个大一个多念什么| 金价下跌意味着什么| 潜伏是什么意思| 731是什么意思| 尿路感染看什么科| 什么什么言什么| sama是什么药| 荔枝可以做什么菜| 意大利用什么货币| 莫字五行属什么| 胆固醇高是什么原因引起| 观音成道日是什么意思| 糖类抗原125高是什么意思| 仙居杨梅什么时候上市| 半边脸发麻是什么原因| 今年25岁属什么生肖的| 早上8点到9点是什么时辰| 肾结石是什么原因引起的| 肠炎用什么药| 法国的国鸟是什么| 实操是什么意思| 吃什么补眼睛| 小腿抽筋是什么原因引起的| 右肋骨下方是什么器官| cfmoto是什么牌子| pa66是什么材料| 甘油三酯高会引起什么病| 壁立千仞无欲则刚是什么意思| 胸闷要做什么检查| 什么什么闻名| 未见卵黄囊及胚芽是什么意思| 足字旁的有什么字| 眼袋浮肿是什么原因| 月经不调吃什么药效果好| 42属什么| 什么坚果适合减肥吃| 10个油是什么意思| 青梅竹马是什么意思| 哈密瓜什么时候成熟| 什么食物含锌多| 国画是什么| 尿失禁吃什么药| 凶神宜忌是什么意思| 农田种什么最赚钱| 增值税是什么| 肝是起什么作用的| 白色裤子配什么上衣| 放热屁是什么原因| 疗愈是什么意思| c肽是什么意思| 看诊是什么意思| 1997年属牛的是什么命| 孙楠留什么给你| 口腔扁平苔藓吃什么药好得快| 什么眼霜去皱效果好| 什么叫腺瘤| 梦见笑是什么意思| 一带一路是指什么| 什么什么有力| 老人吃什么水果对身体好| 1995年五行属什么| 手麻抽筋是什么原因引起的| 知柏地黄丸治什么病| 什么牌子的护肝药最好| 流口水是什么原因| 什么是三好学生| 便秘吃什么药| 狗吃什么| 锅底灰能治什么病| 啥是什么意思| 陈赫火锅店叫什么名字| 吃什么补气血| 梦到装修房子是什么征兆| 什么是跨域| 老人脚浮肿是什么原因引起的| 手指头麻木吃什么药| 型男是什么意思| 什么东西最补心脏| 凉皮加什么才柔软筋道| 1998年五行属什么| 什么是横纹肌肉瘤| 蛊惑是什么意思| 松香有毒吗对人体有什么危害| 倒数第二颗牙齿叫什么| 脚后跟长痣有什么寓意| 手震颤是什么原因引起的| 射手男和什么星座最配| 窦骁父母是干什么的| 摧枯拉朽是什么意思| 吃鹅蛋有什么好处和坏处| 孩子发烧是什么原因引起的| 胃烧灼感是什么原因引起的| 颈椎病挂号挂什么科| sin是什么边比什么边| 小孩子晚上睡觉磨牙是什么原因| 早晨4点是什么时辰| 腐竹炒什么好吃| 腋毛癣用什么药膏最好| 现在买什么股票好| 手链突然断了预示什么| 引产什么意思| 手抖心慌是什么原因| 肝阳性是什么意思| alp医学上是什么意思| 人体最长的骨头是什么| 女司机为什么开不好车| 脚心发痒是什么原因| 水瓶座前面是什么星座| 乐果农药适合杀什么虫| 小孩积食发烧吃什么药| mj什么意思| 两点水的字和什么有关| 圆舞曲是什么意思| 心脏早搏是什么症状| 为什么说金克木生财| 酒后大量出虚汗什么原因| 磁场是什么| 眉中间有竖纹代表什么| 蛇形分班是什么意思| 亚甲炎吃什么药效果好| 什么的快乐| 新奇的什么| 阿飞是什么意思| 二氧化碳是什么| 天五行属什么| 容易出虚汗是什么原因| 燕窝是什么东西做成的| 生脉饮适合什么人群| 冷暖自知的前一句是什么| cm是什么| 渝北区有什么好玩的地方| 甲己合化土什么意思| 排骨和什么菜搭配最好| 如夫人是什么意思| 孕妇红细胞偏低是什么原因| 为什么会得多囊卵巢| 血栓是什么意思| 如梦初醒是什么意思| 生意兴隆是什么生肖| 红楼梦为什么是四大名著之首| 炒木耳为什么会炸锅| 8月1号是什么星座| 出清什么意思| 皮肤黑穿什么颜色的衣服好看| 被子植物是什么| 口僻是什么病| 为什么老是犯困想睡觉| 医学生规培是什么意思| 小孩肚子疼是什么原因| 为什么会得人工荨麻疹| 猪的五行属什么| 平躺头晕是什么原因| 营养神经吃什么药效果好| 什么发色显皮肤白| 硫黄是什么| 嚼槟榔为什么上瘾| 没有精液是什么原因| 跨界歌手是什么意思| 什么是乳清蛋白粉| 50岁是什么之年| 土黄色裤子配什么颜色上衣| 巧克力和什么不能一起吃| 海洋中最大的动物是什么| 1990年是什么年| 芃字五行属什么| 军五行属什么| 白化病是什么能活多久| 黄色配什么颜色最搭| 韫字五行属什么| 工字五行属什么| 医生为什么看瞳孔知道没救了| 糖尿病人喝什么茶最好| 老年人血压忽高忽低是什么原因| 珠是什么生肖| 两个o型血能生出什么血型的孩子| 沙门氏菌用什么药最好| 屋尘螨和粉尘螨是什么| 不动产权是什么意思| 拉肚子是什么原因造成的| 产后吃什么对身体恢复好| 2月19是什么星座| homme是什么意思| 鄙视是什么意思| 羊肉馅饺子放什么菜| 发什么大成语| 大便呈绿色是什么原因| toshiba是什么牌子| 梦见买鞋子是什么意思| 积水是什么意思| 鼻子冒热气是什么原因| 娘子啊哈是什么歌| 异性朋友是什么意思| 胰腺是什么| 条件致病菌是什么意思| 瑕疵是什么意思| 车前草治什么病| 儿童经常头晕什么原因导致的| 亚硝酸盐阴性是什么意思| 打了狂犬疫苗不能吃什么| 男性漏尿是什么原因| 大腿内侧什么经络| 哥文花园女装什么档次| 高甘油三酯血症是什么意思| 属虎五行属什么| 痛经是什么感觉| 为什么醋能让疣体脱落| 中国的国树是什么树| 母亲o型父亲b型孩子是什么血型| 学前班是什么意思| 农历11月18日是什么星座| 俎是什么意思| 7月22号是什么星座| 什么是偏爱| 前列腺不能吃什么食物| 血氨高是什么原因| 鲫鱼吃什么| 甲状腺肿物是什么意思| 备孕喝豆浆有什么好处| dragon是什么意思| 小儿支气管炎咳嗽吃什么药好得快| mrmrs是什么牌子| 肝的主要功能是什么| 在干什么| 员工体检费计入什么科目| 脑膜炎吃什么药| 胸疼是什么原因引起的| 犇是什么意思| 1.28什么星座| 狗不能吃什么水果| 一只眼睛充血是什么原因| 456是什么意思| 来月经有血块是什么原因| 大豆和黄豆有什么区别| 子时右眼跳是什么预兆| 心病科主要看什么病| 三点水一个条读什么| 感冒有什么症状| 女人吃什么补气血| 电话正在通话中是什么意思| 百度

南开建委护航重点项目

数据库 其他数据库
在InnoDB中的实现主要是为了提高数据库并发性能,用更好的方式去处理读-写冲突,做到即使有读写冲突时,也能做到不加锁,非阻塞并发读,而这个读指的就是快照读,而非当前读。当前读实际上是一种加锁的操作,是悲观锁的实现。而MVCC本质是采用乐观锁思想的一种方式。

什么是 MVCC

百度 这种谨慎对于折叠手机这一正在试水的产品而言并不过分。

MVCC(Multiversion Concurrency Control)翻译过来是多版本并发控制,和数据库锁一样,也是一种并发控制的解决方案。

在InnoDB中的实现主要是为了提高数据库并发性能,用更好的方式去处理读-写冲突,做到即使有读写冲突时,也能做到不加锁,非阻塞并发读,而这个读指的就是快照读,而非当前读。当前读实际上是一种加锁的操作,是悲观锁的实现。而MVCC本质是采用乐观锁思想的一种方式。

快照读

所谓快照读,就是读取的是快照数据,即快照生成的那一刻的数据,像我们常用的普通的SELECT语句在不加锁情况下就是快照读:

SELECT * FROM xx_table WHERE ...

注意:快照读的前提是隔离级别不是串行级别,串行级别下的快照读会退化成当前读。

当前读

当前读读取的是记录的最新版本(最新数据,而不是历史版本的数据),读取时还要保证其他并发事务不能修改当前记录,会对读取的记录进行加锁。加锁的SELECT,或者对数据进行增删改都会进行当前读:

SELECT * FROM xx_table LOCK IN SHARE MODE; #共享锁
SELECT * FROM xx_table FOR UPDATE;         #排他锁
INSERT INTO xx_table values ...        #排他锁
DELETE FROM xx_table WHERE ...        #排他锁
UPDATE xx_table SET ...         #排他锁

解决什么问题

我们知道,在数据库中,对数据的操作主要有2种,分别是读和写,而在并发场景下,就可能出现以下三种情况:

  • 读-读并发:不存在任何问题,也不需要并发控制
  • 读-写并发:有线程安全问题,可能会造成事务隔离性问题,可能遇到脏读,幻读,不可重复读
  • 写-写并发:有线程安全问题,可能会存在更新丢失问题

在没有写的情况下读-读并发是不会出现问题的,而写-写并发这种情况比较常用的就是通过加锁的方式实现。那么,读-写并发则可以通过MVCC的机制解决。

实现原理

Undo Log

undo log是Mysql中比较重要的事务日志之一,是一种用于回退的日志,在事务没提交之前,MySQL会先记录更新前的数据到undo log日志文件里面,当事务回滚时或者数据库崩溃时,可以利用undo log来进行回退。

  • insert undo只在事务回滚时起作用,当事务提交后,该类型的undo日志就没用了,它占用的Undo Log Segment也会被系统回收
  • update或delete时产生的undo log,不仅在事务回滚时需要,在快照读时也需要;所以不能随便删除,只有在快速读或事务回滚不涉及该日志时,对应的日志才会被purge线程统一清除

一条记录在同一时刻可能有多个事务在执行,那么undo log会有一条记录的多个快照,那么在这一时刻发生SELECT要进行快照读的时候,要读哪个快照呢?

行记录的隐式字段

其实,数据库中的每行记录中,除了保存了我们自己定义的一些字段以外,还有一些重要的隐式字段的:

  • db_row_id:隐藏主键,如果我们没有给这个表创建主键,那么会以这个字段来创建聚簇索引
  • db_trx_id:对这条记录做了最新一次修改的事务的ID
  • db_roll_ptr:回滚指针,指向这条记录的上一个版本,其实他指向的就是Undo Log中的上一个版本的快照的地址

注意:以上字段只有在聚簇索引的行记录中才会有,而在普通二级索引中是没有这些值的。

每一次记录变更之前都会先存储一份快照到undo log中,那么这几个隐式字段也会跟着记录一起保存在undo log中,就这样,每一个快照中都有一个db_trx_id字段表示了对这个记录做了最新一次修改的事务的ID ,以及一个db_roll_ptr字段指向了上一个快照的地址。(db_trx_id和db_roll_ptr是重点,后面还会用到)

这样就形成了一个快照链表:

图片图片

有了undo log,又有了几个隐式字段,我们好像还是不知道具体应该读取哪个快照,那怎么办呢?

Read View

Read View 是InnoDB中一个至关重要的概念,是实现MVCC的基础,同时也是支持不同的事务隔离级别的基础,同时提高系统的并发能力和性能。

Read View主要来帮我们解决可见性的问题的, 即他会来告诉我们本次事务应该看到哪个快照,不应该看到哪个快照。

  • 在可重复读(Repeatable Read)级别下,快照(Read View)在事务开始后第一次查询时创建一次,并在整个事务期间保持不变。
  • 在读已提交(Read Committed)级别下,快照(Read View)会在每次查询时重新创建,以反映数据库中的最新提交更改。

在Read View中有几个重要的属性:

  • trx_ids,表示在生成Read View时当前系统中活跃的读写事务的事务id列表。
  • low_limit_id,应该分配给下一个事务的id值。
  • up_limit_id,未提交的事务中最小的事务ID。
  • creator_trx_id,创建这个Read View的事务ID。

Read View遵循一个可见性算法,主要是将要被修改的数据的最新记录中的DB_TRX_ID(即当前事务ID )取出来,与系统当前其他活跃事务的ID去对比(由Read View 维护),如果DB_TRX_ID跟Read View的属性做了某些比较,不符合可见性,那就通过DB_ROLL_PTR回滚指针去取出Undo Log中的DB_TRX_ID再比较,即遍历链表的DB_TRX_ID(从链首到链尾,即从最近的一次修改查起),直到找到满足特定条件的DB_TRX_ID,那么这个DB_TRX_ID所在的旧记录就是当前事务能看见的最新老版本。

案例

假如一个ReadView的内容为:

trx_ids = [5,6,8)
low_limit_id = 8
up_limit_id = 5
creator_trx_id = 7

假设当前事务要读取某一个记录行,该记录行的db_trx_id(即最新修改该行的事务ID)为 trx_id,那么,就有以下几种情况了:

1、trx_id<up_limit_id,即小于5的事务,说明这些事务在生成ReadView之前就已经提交了,那么该事务的结果就是可见的。

2、trx_id>=low_limit_id,即大于8的事务,说明该事务在生成ReadView后才生成,所以该事务的结果就是不可见的。

3、up_limit_id<trx_id<low_limit_id,即大于等于5,小于8,这种情况下会再拿事务ID和Read View中的trx_ids进行逐一比较。

如果,事务ID在trx_ids列表中,如6,那么表示在当前事务开启时,这个事务还是活跃的,那么这个记录对于当前事务来说应该是不可见的。

如果,事务id不在trx_ids列表中,如7,那么表示的是在当前事务开启之前,其他事务对数据进行修改并提交了,所以,这条记录对当前事务就应该是可见的。

当然这里有个例外情况,那就是这个trx_id=creator_trx_id,那么就肯定是可见的

总结一下就是,一个事务能看到的是在他开始之前就已经提交的事务的结果,而未提交的结果都是不可见的。

当数据的事务ID不符合Read View规则时候,那就需要从undo log里面获取数据的历史快照,然后数据快照的事务ID再来和Read View进行可见性比较,如果找到一条快照,则返回,找不到则返回空。

总结

图片图片

在InnoDB中MVCC就是通过Read View + Undo Log来实现的,undo log中保存了历史快照,而Read View用来判断具体哪一个快照是可见的。

责任编辑:武晓燕 来源: 一安未来
相关推荐

2025-08-05 18:44:45

MVCC事务

2025-08-05 15:13:52

PostgreSQL MVCC机制

2025-08-05 08:16:50

MySQL SQL 语句数据库

2025-08-05 07:19:00

2025-08-05 06:23:18

MVCC并发事务

2025-08-05 10:11:37

RedisRedis主键失效NoSQL

2025-08-05 11:08:52

Redis主键失效

2025-08-05 10:27:39

Redis缓存

2025-08-05 14:22:41

PHP异常机制

2025-08-05 08:55:43

本地线程变量共享全局变量

2025-08-05 18:16:39

MVCC隔离级别幻读

2025-08-05 15:13:02

2025-08-05 05:10:00

2025-08-05 10:51:56

MySQLMVCC并发性

2025-08-05 13:55:31

JavaScript预解析原理及实现

2025-08-05 05:53:07

DubboSPI机制

2025-08-05 16:00:23

MySQL并发控制MVCC

2025-08-05 14:37:38

2025-08-05 08:58:38

Docker存储容器

2025-08-05 09:03:55

HTTP缓存Web
点赞
收藏

51CTO技术栈公众号

牛气冲天是什么生肖 激光脱毛和冰点脱毛有什么区别 瞳孔放大意味着什么 颈椎挂什么科 一直放屁什么原因
什么口服液补血补气最好 魔芋爽是什么做的 弥漫性病变是什么意思 含羞草能治什么病 军统是什么
龙延香是什么 喝什么最容易减肥 9月份出生的是什么星座 八十岁叫什么之年 激素药是什么意思
三个犬念什么 爱因斯坦发明了什么 起鸡皮疙瘩是什么原因 鱼跳出鱼缸有什么征兆 拘禁是什么意思
护佑是什么意思hcv8jop2ns8r.cn 鸡头米是什么东西hcv7jop9ns8r.cn 5.13是什么星座1949doufunao.com 指甲长得快是什么原因hcv8jop8ns3r.cn 什么赴什么继hcv7jop7ns1r.cn
盆底肌高张是什么意思hcv9jop5ns3r.cn %是什么意思hcv8jop6ns9r.cn 病例是什么hcv7jop9ns8r.cn cos是什么hcv8jop3ns4r.cn 婴儿坐飞机需要什么证件hcv8jop2ns2r.cn
青岛为什么叫青岛hcv9jop3ns4r.cn 肌酸粉有什么作用hcv9jop7ns1r.cn 气滞血瘀是什么意思clwhiglsz.com 为什么睡久了会头疼hcv8jop1ns4r.cn 男人下面有异味什么原因wzqsfys.com
手发抖是什么病的先兆hcv7jop4ns5r.cn 低血糖什么症状hcv8jop4ns3r.cn 西罗手表什么档次hcv8jop6ns1r.cn 宫颈纳氏囊肿什么意思youbangsi.com 放疗为什么死得更快hcv8jop7ns1r.cn
百度