MVCC
即多版本并发控制主要是为了解决数据库中并发事务读写的一致性问题,那么多个事务并发执行的时候事务的隔离到底是怎么实现的呢?Mysql
默认的RR
隔离级别是怎样避免不可重复读的问题呢?我们好好来分析一下。
-
什么是undo log多版本链
-
MVCC如何保证事务隔离
-
总结
Mysql
的MVCC
机制,以undo log
版本链为实现基础。因此要理解MVCC
机制,我们得先分析下undo log
版本链是个什么东东。Innodb
存储引擎给每个数据表都添加了三个隐藏字段:DB_TRX_ID
、DB_ROLL_PTR
、DB_ROW_ID
。
(1)DB_TRX_ID
: 标记更新当前数据记录的transaction id
,每处理一个事务,其值自动+1。
(2)DB_ROLL_PTR
: 回滚指针,记录了最新一次修改该条记录的undo log
,回滚的时候就通过这个指针找到undo log
回滚。
(3)DB_ROW_ID
: 当数据表没有指定主键时,数据库会自动以这个列来作为主键,生成聚集索引。
假设有如下的一条数据,此时这条数据对应的DB_TRX_ID
为10,由于之前没有数据,因此回滚指针对应指向空地址。
每个事务都有自己的一个id
,就像其身份证一样唯一标记该事务。当事务启动的时候,向Innodb
存储引擎进行申请。假设此时如果打南边来了个事务A,它的事务id
为12,事务A对表中的数据字段count进行修改,修改后该条数据对应的事务id
为12,同时回滚指针指向实际的undo log
回滚日志的地址。
此时打北边又来了个事务B,它的事务id为20,事务B将表中的数据字段count
修改为21,对应数据的事务id变为20,回滚指针指向上一条undo log
信息。如下图所示:
如果一直有事务进行数据的修改,那么就会形成一条由回滚指针串联的undo log多版本链条。
阐述完了undo log
多版本链条原理,我们知道当一个事务A(事务id=12)更新数据后,当前数据的事务id变为12,同时回滚指针指向undo log
数据。每次进行数据更新后,事务id就是修改数据的事务id,同时回滚指针指向回滚数据,最终形成undo log
链。但是仅仅依靠undo log
多版本链好像并不能实现事务并发执行时的相互隔离,因此我们需要一种机制可以利用undo log
多版本链来实现事务隔离。这个机制就是ReadView
。
Mysql
执行事务的时候,会生成一个ReadView
,其中会包含以下重要信息:
(1)m_ids
:mysql中未提交的事务id集合;
(2)min_trx_id
:集合中最小的事务id;
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新
如果你觉得这些内容对你有帮助,可以添加V获取:vip1024b (备注Java)
最后
我想问下大家当初选择做程序员的初衷是什么?有思考过这个问题吗?高薪?热爱?
既然入了这行就应该知道,这个行业是靠本事吃饭的,你想要拿高薪没有问题,请好好磨练自己的技术,不要抱怨。有的人通过培训可以让自己成长,有些人可以通过自律强大的自学能力成长,如果你两者都不占,还怎么拿高薪?
架构师是很多程序员的职业目标,一个好的架构师是不愁所谓的35岁高龄门槛的,到了那个时候,照样大把的企业挖他。为什么很多人想进阿里巴巴,无非不是福利待遇好以及优质的人脉资源,这对个人职业发展是有非常大帮助的。
如果你也想成为一名好的架构师,那或许这份Java核心架构笔记你需要阅读阅读,希望能够对你的职业发展有所帮助。
中高级开发必知必会:
好的架构师,那或许这份Java核心架构笔记你需要阅读阅读,希望能够对你的职业发展有所帮助。
中高级开发必知必会:
[外链图片转存中…(img-FNw6bIQT-1711947264024)]