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。

posted @   mooonquakes  阅读(9)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
点击右上角即可分享
微信分享提示