[TOC]
# undo log
**undo log是每次修改数据前,先把数据本来的形态记录到undo log中,再修改数据**
**Undo日志记录一定要在所有的新余额写入硬盘之后再写入,因为提交事务是以undo log为准的**
**数据修改后不是直接写到mysql的表中,而是写带redo log中,再由redo log一次性写到mysql表中**
比如旺财有200块钱, 小强有50 块钱,现在旺财要给小强转账,假设转100块吧, 你说说,你是怎么实现要么不做,要么全做的。 ”
(1) 开始事务 T1 (假设T1是个事务的内部编号)
(2) 旺财余额 = 旺财余额 -100
(3) 小强余额 = 小强余额 + 100
(4) 提交事务 T1
~~~
[开始事务 T1]
[事务T1, 旺财原有余额,200]
[事务T1, 小强原有余额,50]
[提交事务 T1]
~~~
什么时候应该记录Undo日志,什么时候把Undo日志写入文件呢?
一开始的时候我都不知道程序到底要操作那个字段,怎么记录Undo日志,怎么写入硬盘文件?
把日志记录也放到了内存的Undo日志缓冲区,伺机写入硬盘
![](https://box.kancloud.cn/6be9792550338f53c58abcc5fd306e7f_599x509.png)
如果系统在第4步和第5步之间崩溃,旺财的余额写入了硬盘,但是小强的还没写入, 那Undo日志看起来是这样的:
~~~
[开始事务 T1]
[事务T1, 旺财原有余额,200]
~~~
由于找不到事务结束的日志, 你会进行恢复操作, 把旺财的原有余额给恢复了。 ”
Tomcat 接过来说:“如果是在第7步和第8步之间系统崩溃,旺财和小强的最新余额都写入了硬盘,但是没有提交事务, 那Undo日志看起来是这样的:
~~~
[开始事务 T1]
[事务T1, 旺财原有余额,200]
[事务T1, 小强原有余额,50]
~~~
由于没有事务结束的日志,你也需要进行恢复,把旺财和小强的原有余额恢复成200和50 ”
如果是在第8步和第9步之间系统崩溃, 旺财和小强的最新余额都写入了硬盘, 也提交了事务, 但是提交事务的操作没有写入Undo 日志, 所以Undo日志还是这样:”
~~~
[开始事务 T1]
[事务T1, 旺财原有余额,200]
[事务T1, 小强原有余额,50]
~~~
由于没有事务结束的日志,你还得需要进行恢复,把旺财和小强的原有余额恢复成200和50”
是不是可以应付各种情况啊?
~~~
1. 在你把最新余额写入硬盘之前, 一定要先把相关的Undo日志记录写入硬盘.
例如[事务T1, 旺财原有余额,200] 一定要在旺财的新余额=100写入硬盘之前写入。
2. [提交事务 T1] 这样的Undo日志记录一定要在所有的新余额写入硬盘之后再写入.
有了这两条的保证,我就可以高枕无忧了!, 比如说,换个操作次序也没有问题:”
~~~
![](https://box.kancloud.cn/55d62097a7aa5bef838841b336724631_594x461.png)
- SQL
- 名词
- mysql
- 初识mysql
- 备份和恢复
- 存储引擎
- 数据表损坏和修复
- mysql工具
- 数据库操作
- 增
- 删
- 改
- 查
- 数据类型
- 整数类型
- 小数类型
- 日期时间类型
- 字符和文本型
- enum类型
- set类型
- 时间类型
- null与not null和null与空值''的区别
- 数据表操作
- 创建
- 索引
- 约束
- 表选项列表
- 表的其他语句
- 视图
- sql增删改查
- sql增
- sql删
- sql改
- sql查
- sql语句练习
- 连接查询和更新
- 常用sql语句集锦
- 函数
- 字符函数
- 数值运算符
- 比较运算符与函数
- 日期时间函数
- 信息函数
- 聚合函数
- 加密函数
- null函数
- 用户权限管理
- 用户管理
- 权限管理
- pdo
- 与pdo相关的几个类
- 连接数据库
- 使用
- pdo的错误处理
- pdo结果集对象
- pdo结果集对象常用方法
- pdo预处理
- 常用属性
- mysql编程
- 事务
- 语句块
- mysql中的变量
- 存储函数
- 存储过程
- 触发器
- mysql优化
- 存储引擎
- 字段类型
- 三范式和逆范式
- 索引
- 查询缓存
- limit分页优化
- 分区
- 介绍
- 分区算法
- list分区
- range范围
- Hash哈希
- key键值
- 分区管理
- 特别注意
- 分表
- 数据碎片与维护
- innodb表压缩
- 慢查询
- explain执行计划
- count和max,groupby优化
- 子查询优化
- mysql锁机制
- 介绍
- 演示
- 总结
- 乐观锁和悲观锁
- 扛得住的mysql
- 实例和故事
- 系统参数优化
- mysql体系结构
- mysql基准测试
- 索引
- mysql的复制
- win配置MySQL主从
- mysql5.7新特性
- 常见问题
- general log
- 忘记密码
- uodo log与redo log
- 事务隔离级别
- mysql8密码登录
- explain
- 高效的Tree表
- on delete cascade 总结
- mongod
- 简介
- 集合文档操作语句
- 增删改查
- 索引
- 数据导入和导出
- 主从复制
- php7操作mongod
- 权限管理
- redis
- redis简介
- 3.2版本配置文件
- 3.0版本配置文件
- 2.8版本配置文件
- 配置文件总结
- 外网连接
- 持久化
- RDB备份方式保存数据
- AOF备份方式保存数据
- 总结
- win安装redis和sentinel部署
- 事务
- Sentinel模式配置
- 分布式锁
- 管道
- php中redis代码
- 发布订阅
- slowlog
- Redis4.0
- scan和keys
- elasticsearch
- 配置说明
- 启动
- kibana
- kibana下载
- kibana配置文件
- kibana常用功能
- 常用术语
- Beats
- Beats简介
- Filebeat
- Packetbeat
- Logstash
- 配置
- elasticsearch架构
- es1.7
- head和bigdesk插件
- 插件大全
- 倒排索引
- 单模式下API增删改查
- mget获取多个文档
- 批量操作bulk
- 版本控制
- Mapping映射
- 基本查询
- Filter过滤
- 组合查询
- es配置文件
- es集群优化和管理
- logstash
- kibana
- es5.2
- 安装
- 冲突处理
- 数据备份
- 缺陷不足
- 集群管理api
- 分布式事务
- CAP理论
- BASE模型
- 两阶段提交(2PC)
- TCC (Try-Confirm-Cancle)
- 异步确保型
- 最大努力通知型
- 总结