前言
面试时候,经常会被问到什么是事务、事务的特征、事务的隔离级别这些八股文问题,凭死记硬背通常也可回答的七七八八。但是面试官一旦换个角度问这些问题,有时候可能就语塞了。
所以学一个知识,我总在想有没有那样一个万变不离其宗的底层知识,我掌握了它便能一通百通,相关问题我就都会了,比如面试官问这些问题:
- 写线程操作一条数据,另外一个读线程也在读取这条数据,写线程还没有提交事务,读线程已经读到更改后的数据了,此时数据库的隔离级别是什么?
- 可重复读的使用场景举例?
- 事务隔离是怎么通过视图实现的?
- 读已提交、可重复读是怎么通过视图构建实现的?
- 二阶段提交了解吗?redo log、binlog了解吗?都有什么用处?
- 并发版本控制(MVCC)的概念是什么, 是怎么实现的?
- 什么是长事务?怎么查询各个表中的长事务?
- 使用长事务有什么问题?如何避免长事务的出现?
是不是感觉自己掌握的还不够精细?是不是感觉自己离三万月薪还差一点?
同样关于网络的知识也是如此,面试时会经常被人问到三次握手、四次挥手的过程。
那到底三次握手、四次挥手是为了什么?
为什么是三次握手、四次挥手?
四层负载、七层负载的区别是什么?
七层负载的瓶颈是什么?
四层负载又有什么样的问题?
。。。
最难的就是网络了,他是一切分布式、高并发的基础,不可能背一些面试题,看几本书就能说自己精通网络编程了,必须持续学习,举一反三。
所以我的想法是,学习技术不能只是在面试的时候临时抱佛脚,每一个知识点挖进去都是一个新的世界等着你去探索,这需要大量的业余时间来学习,且持续。
本文是学习MySQL底层原理的第一篇,我个人认为学习MySQL一定要从事务开始,也就是先保证数据的一致性(事务、锁),然后再去考虑怎么提升性能(索引)。
本文包含内容:MySQL的事务以及日志、二阶段提交、MVCC等相关知识。
Action
MySQL中,事务的支持是在引擎层的,然而MySQL原生的MyISAM引擎并不支持事务,因此逐渐被支持事务的InnoDB引擎所取代。
那你知道InnoDB引擎的由来吗?
InnoDB的历史
学习事务,除了事务的概念外,我们还应该要学习以下知识点:
- redo log:物理日志,也叫重做日志
- binlog:逻辑日志,也叫归档日志<