Erlo

MySQL - 事务原理

2025-09-04 03:30:36 发布   9 浏览  
页面报错/反馈
收藏 点赞

一、概述

1.1 什么是事务?

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

1.2 事务的特性:ACID

  • 原子性(Atomicity):事务是不可分割的最小操作单元,要么全部成功,要么全部失败
  • 一致性(Consistency):事务完成时候,必须使所有的数据都保持一直状态
  • 隔离性(Isolation):数据库系统提供的隔离机制,保证事务在不受外部并发操作影响的独立环境下运行
  • 持久性(Durability):事务一旦提交或回滚,它对数据库中的数据的改变就是永久的

1.3 事务四大特性的实现

image

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

二、Redo Log(重做日志)

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

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

image

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

  • 物理日志: 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 Log Redo Log
作用 记录数据的旧值,用于回滚事务 记录数据的修改,用于恢复已提交的事务
日志类型 逻辑日志,记录逻辑操作 物理日志,记录数据页的物理修改
实现机制 链表结构,逐条回滚 固定大小的循环写机制,WAL 策略
使用场景 事务回滚、多版本并发控制(MVCC) 崩溃恢复、保证数据持久性
何时写入磁盘 修改数据时记录,但无需立即写入磁盘 事务提交时必须写入磁盘
涉及的 ACID 特性 原子性、隔离性 持久性

登录查看全部

参与评论

评论留言

还没有评论留言,赶紧来抢楼吧~~

手机查看

返回顶部

给这篇文章打个标签吧~

棒极了 糟糕透顶 好文章 PHP JAVA JS 小程序 Python SEO MySql 确认