庾签
2025-8-19 22:05:39
一、概述
1.1 什么是事务?
事务是一组操作的集合,它是一个不可分割的工作单位,事务会把所有的操作作为一个整体一起向系统提交或撤销操作请求,即这些操作:要么同时成功,要么同时失败
1.2 事务的特性:ACID
- 原子性(Atomicity):事务是不可分割的最小操作单元,要么全部成功,要么全部失败
- 一致性(Consistency):事务完成时候,必须使所有的数据都保持一直状态
- 隔离性(Isolation):数据库系统提供的隔离机制,保证事务在不受外部并发操作影响的独立环境下运行
- 持久性(Durability):事务一旦提交或回滚,它对数据库中的数据的改变就是永久的
1.3 事务四大特性的实现
原子性/一致性/持久性:通过Redo Log和Undo Log实现
隔离性:通过锁+MVCC实现
二、Redo Log(重做日志)
Redo Log主要用来实现四大特性中的"持久性"
重做日志,记录的是事务提交时数据页的物理修改,该日志文件由两部分组成:重做日志缓冲(redo log buffer)以及重做日志文件(redo log file),前者是在内存中,后者在磁盘中,当事务提交之后会把所有修改信息都存到该日志文件中,用于在刷新脏页到磁盘,发生错误时,进行数据恢复使用
- 客户端发起UPDATE/DELETE请求到InnoDB存储引擎 Buffer Pool缓冲池
- 判断缓冲池中是否存在数据,如果有,则直接进行修改,如果没有,则通过后台线程读取磁盘中的数据文件到缓冲池
- 在缓冲池直接进行SQL操作,这时候Buffer Pool中是更新好的数据,数据文件中是老的数据,我们称Buffer Pool中的页为脏页
- 将增删改的数据现记录到Redo Log Buffer中,里面记录的是数据页的物理变化
- 事务提交时,将Redo Log Buffer中的变化刷新到磁盘当中,生成Redo Log日志文件
- 过一定时间,进行脏页刷新
2.1 Redo Log的实现
- 物理日志: Redo Log 是物理日志,记录的是物理数据页的更改,而不是 SQL 操作或逻辑操作。它记录了数据库物理块的变更,比如某个数据页上某条记录的修改。
- WAL(Write-Ahead Logging)机制: InnoDB 采用 WAL 机制,即先写日志,再写磁盘。每次事务提交时,InnoDB 会将 Redo Log 先写入磁盘,而后再慢慢将实际修改的数据写入磁盘。
- 循环写机制: Redo Log 采用固定大小的循环写机制。当日志写满时,会从头开始重新写。因此,在系统运行时,InnoDB 会定期将日志应用到数据页,并将脏页(即被修改但还未写入磁盘的数据页)刷新到磁盘。
2.2 为什么要先把Redo Log刷新到磁盘当中?
分为两种场景:
场景一:如果过一定时间在刷新脏页,如果刷新失败,则无法保证数据的持久性
场景二:如果每次写入都直接刷新到磁盘,这样存在严重的性能问题
如果直接刷新,涉及大量的随机磁盘IO,性能比较低,如果用到Redo Log,不会直接刷新脏页,Redo Log日志文件是追加写入,顺序磁盘IO
2.3 Redo Log的使用场景
- 崩溃恢复: 当数据库崩溃后,通过重启,MySQL 可以根据 Redo Log 恢复所有已提交的事务。这是 MySQL 保证事务持久性的关键机制。
- 提高性能: 因为 Redo Log 可以先于数据页写入磁盘,数据库无需每次事务提交时都立即写入数据页,从而显著提高了写操作的性能。数据页的写入可以在稍后的时间由后台线程异步完成。
三、Undo Log(回滚日志)
Undo Log主要用来实现四大特性中的"原子性"
回滚日志,用于记录数据被修改前的信息,作用包含两个:提供回滚和MVCC(多版本并发控制),undo log和redo log记录物理日志不一样,它是逻辑日志
undo log销毁: undo log在事务执行时产生,事务提交时,并不会立即删除undo log,因为这些日志可能还用于MVCC
undo log存储: undo log采用段的方式进行管理和记录,存存放在前面介绍的rollback segment回滚段中,内部包含1024个undo log segment
3.1 Undo Log的实现
- 逻辑日志: Undo Log是一种逻辑日志,记录的是逻辑上的修改操作,它并不会直接记录每次操作的物理存储修改,而是记录修改前的数据
- 链表结构: InnoDB存储引擎会为每条记录维护一条Undo Log记录,并以链表的方式串联起来,如果事务需要回滚,MySQL会沿着Undo Log链表进行逐条回滚,直至恢复到事务开始时的状态
- Undo Log记录类型:
- 对于INSERT操作: Undo Log记录的是“删除”操作,因为如果事务回滚,需要撤销插入的数据
- 对与DELETE操作: Undo Log记录的是“插入”操作,用来恢复被删除的数据
- 对于UPDATE操作: Undo Log记录的是修改前的旧值,用来恢复原来的值
3.2 使用场景
- 事务回滚: 当事务执行失败或用户显式要求回滚时,Undo Log 会将所有修改的数据恢复到事务开始前的状态
- MVCC(多版本并发控制): Undo Log 也用于实现 MVCC 机制,不同事务可能在不同时间看到不同版本的数据,这些版本的数据就是由 Undo Log 提供的。这样,未提交的事务修改对其他事务是不可见的,帮助实现隔离性
四、Redo Log和Undo Log的区别
对比项Undo LogRedo Log作用记录数据的旧值,用于回滚事务记录数据的修改,用于恢复已提交的事务日志类型逻辑日志,记录逻辑操作物理日志,记录数据页的物理修改实现机制链表结构,逐条回滚固定大小的循环写机制,WAL 策略使用场景事务回滚、多版本并发控制(MVCC)崩溃恢复、保证数据持久性何时写入磁盘修改数据时记录,但无需立即写入磁盘事务提交时必须写入磁盘涉及的 ACID 特性原子性、隔离性持久性
来源:豆瓜网用户自行投稿发布,如果侵权,请联系站长删除 |
|
|
|
相关推荐
|
|