undo:(用于事务回滚)
MySQL从磁盘中读取数据到内存,对内存中的数据进行修改后,undo会保存修改前的数据。举个例子,用户将test表中a的值从原来的5改为新的值10,那么undo日志会保存修改前a的值5,即将旧数据恢复。
redo:(用于数据库的崩溃恢复)
MySQL修改内存中的数据后,并不会立即写入到磁盘中进行持久化,而是随机或者按一定规律进行持久化,这就可能导致内存中的数据在未写入磁盘进行持久化前,如果发生异常故障,将会导致内存中的数据丢失。redo日志就是为了解决这个问题。
写入redo的时机
修改mysql数据时,先修改的是从数据库中复制到内存的拷贝,然后这次修改的内容会追加到redo文件,(redo就是处理在这里可能发生的故障)最后才是commit到数据库中进行持久化。
写入undo的时机
在修改数据前,写入undo日志文件
再举个例子:
假设有A、B两个数据,值分别为1,2.
1. 事务开始
2. 记录A=1到undo log
3. 修改A=3
4. 记录A=3到 redo log
5. 记录B=2到 undo log
6. 修改B=4
7. 记录B=4到redo log
8. 将redo log写入磁盘
9. 事务提交
以上内容整理自https://www.jianshu.com/p/20e10ed721d0
相关文章
- 12-15Apache ZooKeeper - 集群中 Follow 的作用_非事务请求的处理与 Leader 的选举分析
- 12-15cassandra中的ACID,与RDBMS中的事务有何不同?
- 12-15webMethods-Developer/Designer中try-catch与SQL中事务的实现
- 12-15SpringBoot中事务(@Transactional)与try{}catch(){}finally{}之间存在的问题
- 12-15php解决微信开发中用户昵称中的特殊字符与emoji表情写入mysql错误的问题
- 12-15RAC中的gc current block busy与redo log flush
- 12-15MySql中Blob与Text的区别
- 12-15mysql中char,varchar与text类型的区别和选用
- 12-15Mysql 存储引擎中InnoDB与Myisam的主要区别
- 12-15【转】Spring中事务与aop的先后顺序问题