MYSQL事务基础

redolog: innodb层面,主要记录事务对数据页做了那些修改,再把redobuffer刷盘到磁盘的redolog文件,保证持久性。只恢复内存刷盘到redolog的数据,记录数据的物理变化

undolog: 用于事务回滚以及MVCC多版本控制。保证原子性

binlog: 记录数据更改所有操作,记录数据的逻辑变化(sql)。主要用于数据恢复全部、数据库主从配置。

1.redo log

保证事务的原子性和持久性,避免内存中的脏数据写入数据表 IBD 文件,针对的是内存中数据页的修改操作。

执行sql,写入数据到内存中的 redo log buffer,根据一定规则写入磁盘 redo log,数据库故障时通过 redo log 进行恢复到 idb 文件。

Redo Log buffer 写入到日志 redo log 示意图

刷盘规则

用户空间的 redo log buffer 写入磁盘 redo log 需要进过系统内核 os buffer,刷盘可以根据下面规则。

  • 事务 commit 就刷盘(默认)
  • 每秒都刷盘
  • log buffer 占用内存达一定百分比就刷盘
  • 事务中存在检查点时。

redo log写入规则

把 redo buffer 的写入redo log 中,redo log 中存在两个东西,一个是 wirte pos 记录着数据表记录的位置,另一个是 check point 检查点负责擦除。存在间隔代表还可以继续记录新的操作。

LSN

表示日志的逻辑序列号。

2.undo log

用于回滚事务和多版本控制MVCC,记录逻辑日志,每次执行 sql 增加一条回滚 SQL 语句。比如新增语句 insert 时记录一条 delete 语句,执行 update 语句时记录一条反向的 update 语句。如果数据库崩溃,先恢复 redo log 再恢复 undo log。

MVCC(Multi-Version Concurrent Control)

MVCC叫做多版本并发控制,实际上就是保存了数据在某个时间节点的快照

我们每⾏数实际上隐藏了两列,创建时间版本号,过期(删除)时间版本号,每开始⼀个新的事务,版本号 都会⾃动递增。查询 select 不会更新版本号,但是插入 insert,更新 update, 删除 delete 会更新版本号。

3.binlog

mysql 自身的二进制日志,主要用于主从复制和数据恢复。一个事务的 binlog 是完整的不会插入其他事务的 binlog。

拥有3个记录模式:

  • row 模式 每一行操作都记录,日志会很庞大
  • statement 模式 不记录细节,只记录结果,有些 sql 如 now(), last_insert_id() 等会不一致。
  • 混合模式 上面两种结合

binlog 和 redo log 的区别

redolog binlog
innodb特有 mysql本身就有
记录内存中的数据页修改 记录所有操作
先写缓存区,写入完成提交事务 每个sql写入内存缓存或者一个事务提交一次性写入内存缓存
循环写日志,通过记录检查点和write pos 一直追加写入
用于数据库崩溃自动恢复 用于主从和数据恢复

4.事务执行流程

事务执行流程

  1. 查询数据表中待更新的数据到内存中
  2. 将缓存中的数据加载到 innodb 缓存区
  3. 记录 redo log 到 redo log buffer
  4. 记录 undo log 到 undo log buffer
  5. 更新内存数据
  6. 提交事务触发 redo log 刷盘
  7. undo log 通过检查点机制刷盘

5.XA事务

用于支持不同数据库(实数据库例)直接实现分布式事务。

事务管理器: 用于生成不同分支上面的事务

资源管理器:提供对事务的访问能力,实际上一个数据库就可以看作一个资源管理器。

两段提交:

  • prepare阶段 事务管理器想资源管理器发送准备指令,
  • commit 阶段
上次更新时间: 2024/5/7 05:59:02