[mysql系列] mysql 数据库如何实现事务回滚

这里写自定义目录标题

  • 一、事务回滚
  • [二、mysql InnoDB引擎如何实现回滚操作](#二、mysql InnoDB引擎如何实现回滚操作)
    • [2.1 InnoDB引擎的 undo log](#2.1 InnoDB引擎的 undo log)
    • [2.2 具体实现](#2.2 具体实现)
      • [2.2.1 insert 操作](#2.2.1 insert 操作)
      • [2.2.2 delete 操作](#2.2.2 delete 操作)
      • [2.2.3 update 操作](#2.2.3 update 操作)

主要参考资料为:《Mysql 是怎样运行的》

一、事务回滚

根据原子性的定义,一个事务中的操作要么全部成功,要么全部失败。事务回滚机制就是保证"全部失败"的手段。

二、mysql InnoDB引擎如何实现回滚操作

2.1 InnoDB引擎的 undo log

undo log(即撤销日志)是InnoDB引擎中用来记录事务执行过程中所做的修改操作的日志。

当一个事务修改数据库中的数据时,它会生成一些更改操作,这些更改操作就会记录在undo log 中。

下图中为简要描述事务执行时undo log的产生情况,执行第一步后会产生对应的 undo log1,执行第二步后会产生 undo log2。如果此时需要回滚,那么按照 undo log 链表执行一遍即可。

2.2 具体实现

对数据库中的操作而言,无外乎insert、delete、update三中操作,而不同的操作也会生成不同的undo log。

2.2.1 insert 操作

插入操作向数据库中增加了一条记录,回滚时就需要删除掉这条记录,此时 undo log 只需要记录该记录的主键即可。

2.2.2 delete 操作

删除操作会将记录从数据库中删除,在InnnoDB中删除操作氛围两步:

  1. 逻辑删除阶段:将当前记录的deleted_flag 字段标记为 1
  2. 事务提交后,会有专门的线程将记录删除掉,此后该记录被真正删除。

从上述步骤可知,回滚操作只会出现在第一阶段。

对于删除操作的 undo log,主要保存了旧记录的各列信息、roll_pointer(指向 undo log的指针)、trx_id(事务id)。

2.2.3 update 操作

update 操作可以拆分为两个操作:删除旧记录,插入新记录。在InnoDB中对应的 undo log 格式如下,该日志中主要存放修改所涉及的列的数量、原有列的数值信息、roll_pointer 指针。

对于 update 所更新的字段不同,同样分为两类,两种类别所产生的 undo log 不同。

  1. 不涉及了主键字段

    由于不涉及主键字段,InnoDB会在删除阶段直接将记录删除,只生成一条 undo log。

  2. 涉及主键字段

    涉及主键字段的更新,将会影响该记录在聚簇索引中的位置。因此,在删除时会使用逻辑删除,然后插入新的记录。这种情况下,会生成两条 undo log。

相关推荐
晚风_END3 小时前
Linux|操作系统|最新版openzfs编译记录
linux·运维·服务器·数据库·spring·中间件·个人开发
dLYG DUMS4 小时前
DBeaver连接本地MySQL、创建数据库表的基础操作
数据库·mysql
苍煜5 小时前
MySQL分库分表和ES到底怎么选?
数据库·mysql·elasticsearch
茉莉玫瑰花茶5 小时前
Qt 信号与槽 [ 1 ]
开发语言·数据库·qt
czlczl200209255 小时前
松散索引扫描/跳跃索引扫描
数据库·mysql·性能优化
苍煜6 小时前
二叉树、红黑树、B树、B+树通俗教学:各自适配场景+MySQL索引终极选型原因
数据结构·b树·mysql
星马梦缘7 小时前
数据库作战记录 实验7、8
数据库·sql·oracle
安逸sgr7 小时前
Hermes Agent + Obsidian 打造第二大脑(六):分层记忆系统的设计逻辑——L0/L1/L2/L3 四层记忆详解
数据库·agent·知识库·hermes·hermesagent
苍煜8 小时前
一篇讲懂分库分表:概念、spirngboot实战
数据库·oracle
梦想画家8 小时前
PostgreSQL 物化视图实战:从数据固化到智能刷新的全链路指南
数据库·postgresql·物化视图