您的位置: 首页> 数据库> MySQL - 事务原理

MySQL - 事务原理

时间:2025-09-06 08:15:01 来源:互联网

一、概述

1.1 什么是事务?

事务是一组操作的集合,它是一个不可分割的工作单位,事务会把所有的操作作为一个整体一起向系统提交或撤销操作请求,即这些操作:要么同时成功,要么同时失败

1.2 事务的特性:ACID

1.3 事务四大特性的实现

原子性/一致性/持久性:通过Redo Log和Undo Log实现
隔离性:通过锁+MVCC实现

二、Redo Log(重做日志)

Redo Log主要用来实现四大特性中的"持久性"

重做日志,记录的是事务提交时数据页的物理修改,该日志文件由两部分组成:重做日志缓冲(redo log buffer)以及重做日志文件(redo log file),前者是在内存中,后者在磁盘中,当事务提交之后会把所有修改信息都存到该日志文件中,用于在刷新脏页到磁盘,发生错误时,进行数据恢复使用

  1. 客户端发起UPDATE/DELETE请求到InnoDB存储引擎 Buffer Pool缓冲池
  2. 判断缓冲池中是否存在数据,如果有,则直接进行修改,如果没有,则通过后台线程读取磁盘中的数据文件到缓冲池
  3. 在缓冲池直接进行SQL操作,这时候Buffer Pool中是更新好的数据,数据文件中是老的数据,我们称Buffer Pool中的页为脏页
  4. 将增删改的数据现记录到Redo Log Buffer中,里面记录的是数据页的物理变化
  5. 事务提交时,将Redo Log Buffer中的变化刷新到磁盘当中,生成Redo Log日志文件
  6. 过一定时间,进行脏页刷新

2.1 Redo Log的实现

2.2 为什么要先把Redo Log刷新到磁盘当中?

分为两种场景:
场景一:如果过一定时间在刷新脏页,如果刷新失败,则无法保证数据的持久性
场景二:如果每次写入都直接刷新到磁盘,这样存在严重的性能问题

如果直接刷新,涉及大量的随机磁盘IO,性能比较低,如果用到Redo Log,不会直接刷新脏页,Redo Log日志文件是追加写入,顺序磁盘IO

2.3 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的实现

3.2 使用场景

四、Redo Log和Undo Log的区别

对比项Undo LogRedo Log
作用记录数据的旧值,用于回滚事务记录数据的修改,用于恢复已提交的事务
日志类型逻辑日志,记录逻辑操作物理日志,记录数据页的物理修改
实现机制链表结构,逐条回滚固定大小的循环写机制,WAL 策略
使用场景事务回滚、多版本并发控制(MVCC)崩溃恢复、保证数据持久性
何时写入磁盘修改数据时记录,但无需立即写入磁盘事务提交时必须写入磁盘
涉及的 ACID 特性原子性、隔离性持久性
上一篇:VictoriaMetrics单节点部署 下一篇:软考系统分析师·每日学习卡 | [日期:2025-08-18] | [今日主题:数据库封锁协议-安全-备份]

相关文章

相关应用

最近更新