- 了解innodb的逻辑存储结构:表空间,段,区,页,行。
- 了解innodb的架构:内存与磁盘。其中内存主要了解缓冲池与改变缓冲区。缓冲池中事务只有提交,缓冲池才会将脏页与磁盘交换。改变缓冲池本着能不从磁盘读数据就不从磁盘读数据的原则,将对缓冲池不存在的数据的操作直接保存对应数据,然后提交事务时交换。
- 了解innodb的后台线程:包含一个主线程与10个io线程,主线程主要负责刷新脏页到磁盘。
- 了解事务的定义,知道事务的acid四大特性
- 知道事务在提交之前都是在对缓冲区数据进行操作
- 知道事务的四大特性是怎么被保证的:持久性–通过redo log保证 脏页刷新出问题则会将数据恢复再做一次。原子性–通过undo log保证 任何操作的事务都是整体,回滚会直接回滚到事务发生之前(是以事务为原子性而不是一条sql语句)。一致性–上述两个文件组合就保证了缓冲区与磁盘数据一定是一致的。
- 知道什么是当前读:一条select语句加锁(例如:lock in share mode , 或者是 for update)就是当前读,由于加锁,此时不会有任何其它人来修改数据,系统默认读取最新数据(最新的readview),就叫做当前读。
- 知道什么是快照读:使用普通select语句就是快照读,实际上快照读的结果由readview文件undo log版本链来决定,不同隔离模式会有不同的产生机制。默认情况下innnodb是RR隔离,该事务首次普通select才会产生readview文件。而RC隔离则是每次普通select都会产生readview文件。
- 知道readview文件有个匹配规则会去undo log版本链当中查数据。知道readview 的一些参数。比如m_ids(当前活跃事务id)
- 了解mvcc多版本并发控制究竟是如何实现的:实际上就是readview以及undo log版本链,隐藏字段配合完成多并发数据的隔离性。
- 所谓隔离模式,其实也就是由于readview不同导致读取数据不同,隔离的力度不同。
- readview的本质实际上还是找到最后完成提交的版本。(这个时候都是在缓冲区里面)
- 扩展 truncate tablename 是ddl语句不可回滚 相当于drop table再create table 。 delete 是dml 是可回滚的(通过binlog)。
- 幻读文章:https://zhuanlan.zhihu.com/p/103580034
- for update 与 lock in share mode
逻辑存储结构
架构
由内存与磁盘两大部分组成
内存部分
主要是缓冲区
缓冲池:
磁盘部分
后台线程
事务原理
redo log 实现持久性
所谓持久性就是在风险发生时能够进行恢复操作
undo log 保证原子性
MVCC
根据数据库的隔离级别,使用select语句会产生不同的读法
mvcc实现原理 undo log版本链
mvcc之readview
readview决定了快照读所产生的数据
readview 去访问版本链
当前活跃的事务是指未提交的事务
这里的版本号就是上面的DB_TRIX_ID(也就是trix_id).