点击上方蓝色“终端研发部”,选择“设为星标”
学最好的别人,做最好的我们◆前言面试时候,经常会被问到什么是事务、事务的特征、事务的隔离级别这些八股文问题,凭死记硬背通常也可回答的七七八八。但是面试官一旦换个角度问这些问题,有时候可能就语塞了。所以学一个知识,我总在想有没有那样一个万变不离其宗的底层知识,我掌握了它便能一通百通,相关问题我就都会了,比如面试官问这些问题:写线程操作一条数据,另外一个读线程也在读取这条数据,写线程还没有提交事务,读线程已经读到更改后的数据了,此时数据库的隔离级别是什么?可重复读的使用场景举例?事务隔离是怎么通过视图实现的?读已提交、可重复读是怎么通过视图构建实现的?二阶段提交了解吗?rdolog、binlog了解吗?都有什么用处?并发版本控制(MVCC)的概念是什么,是怎么实现的?什么是长事务?怎么查询各个表中的长事务?使用长事务有什么问题?如何避免长事务的出现?是不是感觉自己掌握的还不够精细?是不是感觉自己离三万月薪还差一点?同样关于网络的知识也是如此,面试时会经常被人问到三次握手、四次挥手的过程。那到底三次握手、四次挥手是为了什么?为什么是三次握手、四次挥手?四层负载、七层负载的区别是什么?七层负载的瓶颈是什么?四层负载又有什么样的问题?。。。最难的就是网络了,他是一切分布式、高并发的基础,不可能背一些面试题,看几本书就能说自己精通网络编程了,必须持续学习,举一反三。所以我的想法是,学习技术不能只是在面试的时候临时抱佛脚,每一个知识点挖进去都是一个新的世界等着你去探索,这需要大量的业余时间来学习,且持续。本文是学习MySQL底层原理的第一篇,我个人认为学习MySQL一定要从事务开始,也就是先保证数据的一致性(事务、锁),然后再去考虑怎么提升性能(索引)。本文包含内容:MySQL的事务以及日志、二阶段提交、MVCC等相关知识。◆ActionMySQL中,事务的支持是在引擎层的,然而MySQL原生的MyISAM引擎并不支持事务,因此逐渐被支持事务的InnoDB引擎所取代。那你知道InnoDB引擎的由来吗?InnoDB的历史学习事务,除了事务的概念外,我们还应该要学习以下知识点:rdolog:物理日志,也叫重做日志binlog:逻辑日志,也叫归档日志两阶段提交:如何让数据库恢复到半个月内的任意时间点的状态?MVCC:多版本并发控制是不是面试时候,MySQL这块不是索引就是上面的这些知识点?◆事务的基本概念在MySQL中,事务的概念是指对数据库的一组操作是原子的,要么全部成功,要么全部失败。事务的四个特性:Atomicity(原子性):要么全部成功,要么全部失败。Consistncy(一致性):事务执行的结果必须是让数据库从一个一致性状态变成另外一个一致性状态,无论是事务的提交还是回滚,数据的完整性没有破坏。Isolation(隔离性):一个事务的执行不能被其他事务干扰。Durability(持久性):事务一旦提交,他对数据的改动是持久性的,事务一旦提交,相关的数据就应该从游离态或瞬时态变成持久态。即ACID。另外,原子性、隔离性、持久性最终都是为了一致性,一致性是事务的最终目的。我们先总体上看一条更新类型的SQL语句它的内部执行流程,然后再跟进去学习每一个细节知识点。◆updat语句的执行流程比如这样一条更新语句,其中id是主键:
updattabl_tststnum=num+whrid=;它的MySQL内部执行流程如下:MySQL执行器先找InnoDB引擎读取id=这一行的数据,InnoDB引擎直接用树查找主键id=那条数据,如果数据所在页直接在内存中,那么直接返回,否则先从磁盘读取到缓存中再返回;执行器获得数据后,执行num=num+,再调用InnoDB引擎接口写入新的数据;InnoDB引擎将新的数据更新到内存中,再将这个更新操作记录到rdolog中,此时rdolog日志处于prpar状态,并通知执行器已就绪,随时可以提交事务;MySQL执行器写入binlog日志并持久化到磁盘,并调用InnoDB引擎的事务提交接口,InnoDB引擎将刚刚写入的rdolog日志的状态改为