整个流程在增删改查的时候,会操作内存结构区域,如果里面没有数据就从 。磁盘结构中加载,然后进行操作 。
最后在特定时间会自动从内存结构中刷新到磁盘中 。在磁盘中进行持久化保存下来
事务原理事务事务是一组操作的集合,它是一个不可分割的工作单位,事务会把所有操作作为一个整体一起向系统提交撤销操作请求 。
这些操作要么同时成功要么同时失败 。
事务的四大性质
- 原子性
事务是不可分割的最小操作单元,要么全部成功,要么全部失败 。
- 一致性
事务完成时,必须使所有的数据保持一致性 。
- 隔离性
数据库系统提高隔离机制,保证事务在不受外部并发操作影响的独立环境运行 。
- 持久性
事务一旦提交或回滚,他对数据库的数据改变就是永久的 。
事务的隔离性是由 锁机制和MVCC实现的 。
redo log重做日志,记录的是事务提交时数据页的物理修改,用来实现事务的持久性 。
该日志文件由俩部分组成:
- 重做日志缓冲(redo log buffer)
在内存中
- 重做日志文件(redo log file)
在磁盘中
大概流程:
- 客户端A对innoDB存储引擎的表进行增删改事务操作
- 先访问内存结构中的缓冲池,如果增删改数据在其中不存在,
就会从磁盘中读取数据再刷新到缓冲池(这个数据必须是唯一索引,否则会先进入到更改缓冲区)
- 在缓冲池中变成脏页,并记录在redolog buffer中,后直接刷新到磁盘中
- 如果脏页在一段时间后刷新到磁盘中报错了,可以通过redo log进行恢复 。
文章插图
使用redo log直接刷新到磁盘结构的好处
事务一般是一组多条的增删改查操作,故事务提交的时候会随机的操作多条的记录 。
这些记录会操作多条数据页,这样会产生大量的随机磁盘IO
而直接将redo log文件异步刷新到磁盘io中,由于它是日志文件,日志文件都是追加的,此时是顺序磁盘IO,这样会节约大量的磁盘IO
这种机制叫WAL(Write-Ahead Logging)(先写日志)
然后过一段时间脏页日志才会刷新到磁盘中 。
【MYSQL-->InnoDB引擎底层原理】故俩份日志是循环清理的
事务的redo log日志是为了解决脏页刷新到磁盘出错时进行数据的恢复使用的,用来保证数据的持久性
undo logundo log日志是用来保证事务的原子性的 。
undo log也叫回滚日志,用于记录数据被修改前的信息,作用为:提供回滚和MVCC
redo log记录的是物理日志!
undo log记录的是逻辑日志,可以认为当执行delete 一条记录时,undo log中会记录一条对应的insert记录,反之同理 。
当执行rollback时,就可以从undo log中的逻辑记录读取到对应内容,从而进行回滚 。
Undo log销毁
undo log在事务执行时产生,事务提交时,并不会马上删除undo log,因为这些日志可能还用于MVCC
Undo log存储
undo log采用,段的方式进行管理和记录,存放在前面介绍的rollback segment回滚中,内部包含了1024个undo log segment
这个段是逻辑存储结构的段哦~经验总结扩展阅读
- StampedLock:一个并发编程中非常重要的票据锁
- Longchamp龙骧饺子包
- <三>从编译器角度理解C++代码编译和链接原理
- <一>关于进程虚拟地址空间区域内存划分和布局
- GitLab私有化部署 - CI/CD - 持续集成/交付/部署 - 源代码托管 & 自动化部署
- 🔥支持 Java 19 的轻量级应用开发框架,Solon v1.10.4 发布
- Bert不完全手册9. 长文本建模 BigBird & Longformer & Reformer & Performer
- InnoDB关于事务、锁、MVCC专题
- XXI Open Cup, Grand Prix of Belarus 2020-2021 Winter Petrozavodsk Camp, Belarusian SU Contest 题解
- Petrozavodsk Winter Training Camp 2016: Moscow SU Trinity Contest