文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

MySQL 事务两阶段提交原理简析

2024-11-29 22:54

关注

MySQL 中的日志非常重要,包括实例内的事务以及实例间的主从复制均基于日志实现。

计划通过多篇文章分析多种日志,从而串联日志、事务、复制三个模块之间的关系,本文是第一篇文章,介绍两阶段提交。

其中首先介绍为什么需要两阶段提交,然后简单分析两阶段提交的实现,期间介绍相关知识点,包括分布式事务与崩溃恢复。

概念

两份日志

MySQL 中最重要的两份日志是 redo log 与 binlog。

为什么会有两份日志,原因是使用场景不同。

其中:

两份日志主要有以下三点不同;

两阶段提交

为了保证两份日志之间的逻辑一致,也就是数据与备份的一致性,引入两阶段提交(two-phase commit protocol,2PC)。

为什么需要两阶段提交,那么如果没有两阶段提交,会发生什么呢?

由于 redo log 和 binlog 是两个独立的逻辑,如果不用两阶段提交,要么就是先写完 redo log 再写 binlog,或者采用反过来的顺序。

假设执行 update,将值从 1 改为 2。

假设:

显然,如果没有两阶段提交,无法保证数据与日志的一致性。

那么,有两阶段提交时会怎么样呢?

首先,介绍下两阶段提交的过程,其中将 redo log 的提交拆分为两个步骤,包括 prepare 与 commit,期间写入 binlog。

因此,如果在两阶段提交的不同时刻,MySQL 异常重启会发生什么呢?

崩溃恢复

从前一节的描述中可以发现崩溃恢复时根据两阶段提交的进度进行处理。

参考 MySQL 45 讲,崩溃恢复(crash-recovery)时的完整判断逻辑为:

因此,redo log prepare 后 commit 前崩溃恢复时可能发生回滚或提交,具体与 binlog 的完整性有关。

显然,时刻 B 发生 crash 的情况对应 redo log prepare 完整,且 binlog 完整的场景,因此事务提交。

这里可以提出以下两个问题:

1)如何判断 binlog 完整

2)如何根据 redo log 定位对应的 binlog

接下来分别回答这两个问题。

1)如何判断 binlog 完整

判断 binlog 的完整性有以下两种方式:

如下所示,测试显示 row 与 statement 两种 bnlog 格式中事务的最后一个 event 都是 XID event。

2)如何根据 redo log 定位对应的 binlog

redo log 与 binlog 有一个共同的数据字段,称为 XID。

崩溃恢复的时候,会按顺序扫描 redo log:

其中:

这里可以提出另一个问题,根据事务的持久性,到什么进度后事务将无法回滚?

理论上 MySQL 中通过 redo log 实现事务的持久性,因此 redo log 刷盘后就可以保证对数据库的修改是永久性的,即使发生崩溃也不会丢失,当然也不会回滚。

不过根据事务的两阶段提交协议,binlog 写入代表事务提交,同样不可能发生回滚。

因此,事务无法回滚的关键点是事务的提交,而不是单纯的 redo log 或 binlog 的写入。在事务提交的过程中,两阶段提交机制确保了 redo log 和 binlog 的一致性,这个提交过程标志着事务从可回滚转变为不可回滚。

XA 事务

分布式事务是一种跨多个独立的数据库、系统或网络区域的事务处理方法。

XA 事务是一种遵循 XA 规范的分布式事务,因此 XA 事务是分布式事务的一种实现。

XA 事务依赖两阶段提交(2PC)协议实现分布式事务的一致性和原子性。

两阶段提交是最常见的分布式事务协议,用于保证分布式事务的原子性,显然并不是 MySQL 独有的。

根据 XA 规范,两阶段提交的实现过程中包括两个角色:

两阶段提交中将提交操作分为两个阶段:

MySQL 中的 XA 事务分为外部 XA 与内部 XA。其中:

开启 binlog,SQL 语句涉及一个或多个支持事务的存储引擎。

其中,由于 binlog 与存储引擎是独立单元,可以将 binlog 也看作一个存储引擎,因此需要通过 XA 事务实现 binlog 与存储引擎的数据一致性和原子性,从而保证全部操作要么全部提交,要么全部回滚。

在分布式事务中,XID作为全局事务的唯一标识符,用于跟踪和协调不同数据库实例中的事务部分。这个标识符在事务的所有参与者之间是共享的,以确保事务的一致性和完整性。

因此在 XA 事务中,XID用于在多个数据库实例之间协调事务。

在 MySQL 中,XID(Transaction Identifier)是事务的唯一标识符,用于标记事务的提交。

binlog 中一个事务由一系列事件(event)组成,这个序列由 BEGIN 事件开始,以 XID 事件结束(对于提交的事务)。

因此如果事务被回滚,不会记录 XID 事件,而是记录一个 ROLLBACK 事件。

参考 chatgpt,XID 与 GTID 的主要区别包括:

实现

prepare

参考文章 MySQL 事务二阶段提交 与 MySQL 核心模块揭秘 | 07 期 | 二阶段提交 (1) prepare 阶段,prepare 阶段做的事情分为两类:

其中 undo log 非常重要,原因是:

参考文章 XA事务与两阶段提交。

Undo页面链表的第一个页面的结构见下图,其中记录了一些关于这个事务的一些属性。

其中 Undo Log Segment Header 结构见下图,其中 TRX_UNDO_STATE 字段表示事务所处的状态。

其中 Undo Log Header 结构见下图。

其中:

TRX_UNDO_STATE 的取值包括:

  • TRX_UNDO_ACTIVE:活跃状态,也就是一个活跃的事务正在往这个段里边写入 undo log;
  • TRX_UNDO_CACHED:被缓存的状态。处在该状态的 Undo 页面链表等待着之后被其他事务重用;
  • TRX_UNDO_TO_FREE:对于 insert undo 链表来说,如果在它对应的事务提交之后,该链表不能被重用,那么就会处于这种状态。Undo 页面链表可以被马上清理;
  • TRX_UNDO_TO_PURGE:对于 update undo 链表来说,如果在它对应的事务提交之后,该链表不能被重用,那么就会处于这种状态。Undo 页面链表不可以被马上清理,而是加入 History 链表用于 MVCC,等待 purge 线程清理;
  • TRX_UNDO_PREPARED:包含处于 prepare 阶段(这个阶段是在分布式事务中会出现)的事务产生的 undo log。

commit

commit 阶段做的事情同样分为两类:

具体 commit 阶段的实现与组提交有关,计划下一篇文章中介绍。

因此,在客户端执行 commit 语句或自动 commit 时,MySQL 开启内部 XA 事务,分两阶段完成 XA 事务的提交。

崩溃恢复

崩溃恢复全过程分为多个阶段,其中与事务两阶段提交有关的阶段包括:

未完成事务的状态可能是以下三种之一:

其中未提交事务 TRX_STATE_ACTIVE 对应 redo log 已经刷盘的未提交事务,包括以下三种场景:

因此,为了保证事务的原子性,需要在崩溃恢复时将这些未提交事务回滚,而找到这些未提交事务依赖 undo log。

结论

MySQL 通过事务的两阶段提交实现数据与日志的一致性。

其中数据指 redo log,日志指 binlog,可以认为是两个不同的存储引擎,因此基于分布式事务的 XID 协议实现一致性。

具体实现中将 redo log 的提交拆分为两个步骤,包括 prepare 与 commit,期间写入 binlog。

因此,写入的不同阶段异常重启时:

具体是在崩溃恢复过程中基于两阶段提交保证事务的一致性。

其中:

因此,可以将崩溃恢复过程中使用的日志的顺序理解为 redo log、undo log、binlog。

来源:丹柿小院内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯