事务日志与 两阶段提交

文章详细介绍了InnoDB存储引擎中RedoLog的工作原理,包括其优点、组成、整体流程及不同刷盘策略。同时提到了UndoLog的回滚段管理和两阶段提交在确保事务原子性和一致性的角色。通过对innodb_flush_log_at_trx_commit参数的讨论,阐述了不同刷盘策略对数据持久化的影响。
摘要由CSDN通过智能技术生成

ACID (原子、一致、隔离、持久)
隔离性:锁机制保证
持久性:Redo Log 重做日志
原子性、一致性:Undo Log 回滚日志

Redo Log

redo的优点

在事务提交完成之前把该事务所修改的所有页面都刷新到磁盘

Redo Log 的优点:事务执行过程中,redo log不断记录

redo的组成

Redo log可以简单分为以下两个部分:

  • 重做日志的缓冲 (redo log buffer) ,保存在内存中,是易失的。

参数设置:innodb_log_buffer_size
redo log buffer 大小,默认 16M ,最大值是4096M,最小值为1M。

mysql> show variables like '%innodb_log_buffer_size%';
+------------------------+----------+
| Variable_name | Value |
+------------------------+----------+
| innodb_log_buffer_size | 16777216 |
+------------------------+----------+
  • 重做日志文件 (redo log file) ,保存在硬盘中,是持久的

redo的整体流程

以一个更新事务为例,redo log 流转过程,如下图所示:
在这里插入图片描述

1步:先将原始数据从磁盘中 读入内存中来,修改数据的内存拷贝
第2步:生成一条重做日志并 写入redo log buffer,记录的是 数据被修改后的值
第3步:当 事务commit时,将redo log buffer中的内容刷新到 redo log file,对 redo log file采用追加写的方式
第4步:定期将内存中修改的数据刷新到磁盘中

体会:
Write-Ahead Log(预先日志持久化):在持久化一个数据页之前,先 将内存中相应的日志页持久化

针对这种情况,InnoDB 给出 innodb_flush_log_at_trx_commit 参数,该参数控制 commit提交事务
时,如何将 redo log buffer 中的日志刷新到 redo log file 中
。它支持三种策略:

  • 设置为0 :表示每次事务提交时不进行刷盘操作。(系统默认master thread每隔1s进行一次重做日
    志的同步)
  • 设置为1 :表示每次事务提交时都将进行同步,刷盘操作( 默认值 )
  • 设置为2 :表示每次事务提交时都只把 redo log buffer 内容写入 page cache,不进行同步。由os自
    己决定什么时候同步到磁盘文件

不同刷盘策略演示

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

Undo Log

InnoDB对 undo log的管理采用段的方式,也就是 回滚段(rollback segment) 。每个回滚段记录了
1024 个 undo log segment ,而在每个undo log segment段中进行 undo页 的申请。

在这里插入图片描述

两阶段提交

在这里插入图片描述

由于binlog 没写完就异常,这时候 binlog里面 没有对应的修改记录

主从机的数据 可能不一致
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值