专注于 JetBrains IDEA 全家桶,永久激活,教程
持续更新 PyCharm,IDEA,WebStorm,PhpStorm,DataGrip,RubyMine,CLion,AppCode 永久激活教程

理解事务(二):undo/redo logging

前言

咱们书接上回,上回书说道,可以将事务基本操作用一种伪代码的形式表示,这可以有助于我们更好地理解操作过程。今天呢,主要想介绍undo/redo logging机制,可以理解为如何结合undo/redo来保证事务的ACD特性。

  • 英文资料的切入点是从事务的ACID特性出发,先分别分析undo loggingredo logging,从优缺点角度提出,是否有更灵活(flexible)的机制,最后提出了undo-redo logging
  • 个人觉得看完对理解InnoDB上的undo logredo log帮助很大。

日志记录的伪代码表述

  • 上回书说道,事务操作可以用伪代码表述,其实日志记录方式也可以用伪代码表述,实际记录内容请结合具体平台进行进一步归纳。
  • 日志记录在log buffer(内存)和log file(磁盘)其实是不一样的,这点需要注意。
  • <START T>:表示事务T开始(日志记录在log bufferlog file其实是不一样的,这里需要注意)
  • <COMMIT T>:表示事务T完成
  • <ABORT T>:表示事务T被中断,即完成失败。
  • <T, X, v, w>T是事务IDX表示数据元素,v代表旧值,w代表新值。

undo/redo机制的规则

  • 每种机制都会有相应的规则,而这些规则对事务的实现尤为重要。
  • 规则定义用的是上述介绍的伪代码形式。
  • undo负责回滚未commit的事务。
  • redo负责重做已经commit的事务。

规则定义

  • <T, X, v, W>日志记录写入到日志文件,必须先于相应地数据元素X写入到数据库文件即OUTPUT(X)操作。
  • 事务管理器的具体做法是,在OUTPUT(X)执行之前,将日志记录写入到磁盘(日志缓冲写入日志文件,当然也包含<T, X, v, W>),以此来保证遵守规则。

一个实例

  • 下面从一个事务实例,来介绍下undo/redo机制过程。
  • 例如,我们有个事务T,需要改city表中数据元素Xpopulation属性,也要改user表中数据元素Yage属性,具体执行以及日志记录方式如下。(假设,XY的主键ID都是1,当然还有其他数据项)。

70_1.png

undo/redo恢复过程

  • 我们结合上述图表,分别讨论在,12,11,10,9及9之前(上述表格的序号,表示操作序号)出现系统异常时,是怎么根据undo/redo恢复的。

12

  • COMMIT T写入文件,说明T已经提交。
T的状态 REDO/UNDO 执行结果 备注
已提交 REDO population = 2200 age = 16
  • 其实,这一步REDO是多余的,数据库已经处于一致性状态了,但是规则就是规则,从System failure恢复且要保证一致性,还是需要一次REDO

11

  • 11出错,OUTPUT(Y)执行错误,说明数据元素Y的更改还没有写入到数据库文件中,数据库处于inconsistent state
  • COMMIT T写入文件,说明T已经提交。
T的状态 REDO/UNDO 执行结果 备注
已提交 REDO population = 2200 age = 16

10

  • 10出现系统错误,有两种情况

1、<COMMIT T>已经写入到日志文件(log file) 2、<COMMIT T>还没来得及写入到日志文件,就出现错误。

<COMMIT T>已经写入到日志文件

  • 很显然也是REDO,因为已经认为T已经提交。
T的状态 REDO/UNDO 执行结果 备注
已提交 REDO population = 2200 age = 16

<COMMIT T>没写入

  • 认为T是未提交的,要UNDO
T的状态 REDO/UNDO 执行结果 备注
已提交 UNDO population = 2000 age = 15

9及9之前操作出了问题

  • 很明显,还是UNDO
T的状态 REDO/UNDO 执行结果 备注
已提交 UNDO population = 2000 age = 15

undo/redo恢复过程小结

  • 存在一个问题,只要<COMMIT T>日志记录没有写入到日志文件(log file),在恢复时,就要被UNDO
  • 只能采取某种机制,将<COMMIT T>尽快写入到日志文件。

小结

  • 上述,根据伪代码表示,对undo/redo规则及恢复过程做了梳理。
  • 很显然,随着日志量增大,需要扫描的日志记录就会增大,就需要检查点(checkpoint)机制来实现,日志文件存储优化、以及日志记录扫描优化。
  • 可以参考,undo/redo机制结合着学习InnoDB存储引擎中的redo logundo log

参考

文章永久链接:https://tech.souyunku.com/40457

未经允许不得转载:搜云库技术团队 » 理解事务(二):undo/redo logging

JetBrains 全家桶,激活、破解、教程

提供 JetBrains 全家桶激活码、注册码、破解补丁下载及详细激活教程,支持 IntelliJ IDEA、PyCharm、WebStorm 等工具的永久激活。无论是破解教程,还是最新激活码,均可免费获得,帮助开发者解决常见激活问题,确保轻松破解并快速使用 JetBrains 软件。获取免费的破解补丁和激活码,快速解决激活难题,全面覆盖 2024/2025 版本!

联系我们联系我们