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里面 没有对应的修改记录
主从机的数据 可能不一致