MYSQL进阶-InnoDB引擎之事务原理
MYSQL进阶-InnoDB引擎之事务原理
事务
是一组操作的集合,是一个不可分割的工作单位,事务会把所有的操作作为一个整体提交或撤销操作请求,即这些操作要么同时成功,要么同时失败。
事物的四大特性ACID:
-
原子性 atomicity:事务是不可分割的最小操作单元,要么同时成功要么同时失败
-
一致性 consistency:事务完成时,必须使所有的数据都保持一致
-
隔离性 isolation:数据库系统提供的隔离机制,保证事务在不受外部并发操作影响的独立环境下运行
-
持久性 durability:事务一旦提交或回滚,它对数据库中的数据的改变是永久的
他们实现的原理主要依靠:
redo log
redo log保证事物的持久性
重做日志记录的是事务提交时数据页的物理修改。
该日志文件由两部分组成:重做日志缓冲和重做日志文件。前者在内存中,后者在磁盘中。当事务提交后会把所有修改信息都存到该日志文件中,用于在刷新脏页到磁盘发生错误时,进行数据恢复使用。
Q:为什么每次提交把redolog直接刷新到磁盘中,而不是直接把bufferpool变更的数据页直接刷新到磁盘中?
A:这样做会降低性能。由于事务一组操作往往会修改多条记录,这些记录是随机地去操作数据页的,涉及到大量随机磁盘IO,性能低。使用redo log,不直接刷新变更页,而是刷新日志文件,由于日志文件是追加写入的,是顺序磁盘IO,性能更高。体现了WAL机制(write-ahead logging)
若脏页数据顺利地刷新到磁盘中,则redolog日志中的数据不需要了。所以每隔一段时间会清理redo log日志。——redo log是循环写入的
undo log
undo log解决事物的原子性
回滚日志,用于记录数据被修改前的信息,作用包含两个:提供回滚和MVCC
与redo log记录的物理日志不同的是,它是逻辑日志。比如:当delete一条记录时,undo log中会记录一条对应的insert记录,反之亦然。让update一条记录时,会记录一条相反的update语句(复原)。当执行rollback时,就可以从undo log中的逻辑记录读取到相应的内容并进行回滚。
-
undo log销毁:undo log在事务执行时产生,事务提交时,不会立即删除undo log,因为这些日志可能还用于MVCC。
-
undo log存储:undo log采用段的方式进行管理和记录,存放在前面介绍的rollback segment回滚段中,内部还包括1024个undo log segment。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY