mysql事务底层原理
本文转载自https://www.cnblogs.com/yidengjiagou/p/16413825.html
事务有四大特性,分别是原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、持久性(Durability),简称ACID。
原子性是指事务中所有操作要么全部成功,要么全部失败。
一致性是指事务执行前后,数据始终处于一致性状态,不会出现数据丢失。
隔离性是指事务提交前的中间状态对其他事务不可见,即相互隔离。
持久性是指事务提交后,数据的修改永久保存在数据库中。
原子性是undo log实现的,一致性是由代码逻辑层面保证的,隔离性是由mvcc实现的,持久性是基于redo log实现的。
如果没有Redo Log的话,会发生什么?
修改数据的过程就变成这样了:
- 从磁盘加载数据到内存
- 在内存中修改数据
- 把新数据持久化到磁盘
这样做,会有严重的性能问题。
- InnoDB在磁盘中存储的基本单元是页,可能本次修改只变更一页中几个字节,但是需要刷新整页的数据,就很浪费资源。
- 一个事务可能修改了多页中的数据,页之间又是不连续的,就会产生随机IO,性能更差。
所以为了提高写入性能,于是就引入了Redo Log。
看一下引入Redo Log后修改流程:
- 从磁盘加载数据到内存
- 在内存中修改数据
- 把新数据写到Redo Log Buffer中
- 把Redo Log Buffer中数据持久化到Redo Log文件中
- 把Redo Log文件中数据持久化到数据库磁盘中
Undo Log(回滚日志):
Undo Log记录的是逻辑日志,用来回滚事务时,恢复到修改前的数据。
MVCC(多版本并发控制,Multi-Version Concurrency Control):
记录的是某个时间点上的数据快照,用来实现不同事务之间数据的隔离性。
当前读: 读取数据的最新版本,并对数据进行加锁。
快照读: 读取数据的历史版本,不对数据加锁。
在当前读的情况下,是通过加锁来解决幻读。
在快照读的情况下,是通过MVCC来解决幻读。
分类:
mysql理论
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?