恢复策略(上)-撤销事务(UNDO)、重做事务(REDO)

server/2024/10/18 12:28:26/

一、引言

利用前面所建立的冗余数据,即日志和数据库备份,要将数据库从一个不一致的错误状态恢复到一个一致性状态,还需要相关的恢复策略,不同DBMS的事务处理机制所采用的缓冲区管理策略可能不同,发生故障后的数据库不一致错误和状态也会不同,恢复技术和恢复策略的具体实现也会有所不同,假设恢复机制仍采用我们前面讨论的窃取但不强制的缓冲区管理策略,那么当数据库系统发生故障后,就可能会出现

不一致错误

  • 夭折的事务的部分执行结果已对数据库进行了更新,破坏了事务的原子性
  • 已提交的事务对数据库的更新结果不能保存在磁盘上,破坏了事务的持久性,导致数据库处于不一致错误状态

恢复机制要做的就是利用日志来撤销夭折事务来保持事务的原子性重做已提交事务来保持事务的持久性,再利用转储的数据库备份采用一定的恢复策略或算法来将数据库恢复到发生故障前的某个一致性状态

二、撤销事务(UNDO)

对于夭折事务的部分执行结果已对数据库进行了更新这种不一致错误,为保持事务的原子性,应撤销该事务所产生的更新,即对该事务进行UNDO操作

对于从账户A转账1000元到账户B的转账事务,转账前A的账户余额为1500元,账户B的余额为0,事务在执行完对账户A的更新后,可能会因故障导致事务不能继续执行,但对账户A的更新结果,却已写到磁盘中去了,即账户A的值已被改为500元,但账户B的值仍为0元。

或者事务在执行完对账户B的更新后,也可能会因故障导致事务不能提交,而对账户A和账户B的更新结果却都已写入磁盘中去了,即账户A的值已改为500元,账户B的值已为1000元 

以上更新操作相应的更新日志记录已先写入磁盘的日志中

对于该夭折事务,事务的原子性要求夭折事务必须回滚,相当于事务没有执行,这里事务的强制回滚,就是要对事务进行撤销操作,即UNDO操作

恢复机制对事务进行的UNDO操作就是利用日志撤销此事务已对数据库进行的更新,将更新前的旧值重新写会磁盘的数据库,使得该事务好像根本没有执行一样,保持了事务的原子性,使得事务以ROLLBACK方式结束

对于银行转账事务,UNDO操作就是根据系统产生的日志记录,将事务对账户A和账户B更新前的值重新写回到磁盘中去,即账户A的值改回为1500元,账户B的值改回为0元

三、重做事务(REDO)

而对于已提交的事务对数据库的更新结果尚未写回到磁盘上的数据库中这种不一致错误,为保持事务的持久性,应重做该事务所产生的更新,即对该事务进行REDO操作

对于从账户A转账1000元到账户B的转账事务,事务在执行完对账户A和账户B的更新后进行了提交操作,但事务提交后,事务对数据库的更新结果还没有及时地写到磁盘的数据库中,还在内存的数据库缓冲区里,若此时系统发生故障,会使缓冲区中数据丢失 。对于该提交事务,事务的持久性要求,事务对数据库的更新应持久地保存在数据库中,恢复机制要对该事务进行REDO操作,就是利用日志重新执行此事务已对数据库进行的更新,将更新后的新值写入磁盘的数据库中,保持该事务的持久性,使得事务以COMMIT方式结束

对于银行转账事务,REDO操作就是根据系统产生的日志记录,将事务对账户A和账户B的更新后的值写到磁盘中去,即账户A的值改为500元,账户B的值改为1000元 


http://www.ppmy.cn/server/53719.html

相关文章

Unity之Hololens2开发MRTK Profile详解

前言 配置 MRTK 的主要方式之一是使用基础包中的配置文件。 场景中的主要 MixedRealityToolkit 对象具有活动配置文件 - 一个 ScriptableObject。 顶级 MRTK 配置配置文件包含主核心系统的每个核心的子配置文件数据,每个主核心系统都旨在配置其相应子系统的行为。 此外,这些…

一二三应用开发平台应用开发示例(5)——列表视图、树视图、树表视图、树参照视图配置

列表视图 接下来进入列表视图配置,创建的操作方式跟前面相同,如下图所示: 保存后回到列表,点击行记录的配置按钮,进入如下配置页面 可以看到该配置界面相比新增、修改、查看那三个视图要复杂得多,配置项…

MySQL表解锁

查看锁信息 show full processlist 如果一个表被锁定了,会有一个 “Waiting for table metadata lock” 的提示,表明该表正在等待锁定。 解锁表 删除state上有值的事务 kill query 事务id 表解锁完成

微信小程序的跳转页面

在微信小程序中,要实现从当前页面返回到指定页面的功能,通常不直接使用“返回上一页”的逻辑,而是利用小程序的页面栈管理和navigateBack或者重新定向到目标页面的API。下面我将介绍两种主要的方法: 方法一:使用 navi…

求职刷题力扣 DAY38动态规划 part04

1. 1049. 最后一块石头的重量 II 有一堆石头&#xff0c;用整数数组 stones 表示。其中 stones[i] 表示第 i 块石头的重量。 每一回合&#xff0c;从中选出任意两块石头&#xff0c;然后将它们一起粉碎。假设石头的重量分别为 x 和 y&#xff0c;且 x < y。那么粉碎的可能…

学习java第一百一十六天

Spring Framework有哪些不同的功能&#xff1f; 答&#xff1a; 轻量级-Spring 在代码量和透明度方面都很轻便。 IOC-控制反转AOP-面向切面编程可以将应用业务逻辑和系统服务分离&#xff0c;以实现高内聚。容器-Spring 负责创建和管理对象&#xff08;Bean&#xff09;的生命周…

4.2 sql手工注入和自动注入实战(OWASP实战训练)

4.2 sql手工注入和自动注入实战&#xff08;OWASP实战训练&#xff09; 引言1. information_schema1.1 查询数据库名&#xff08;TABLE_SCHEMA&#xff09;、表名&#xff08;TABLE_NAME&#xff09; information_schema.tables1.2 查询数据库名、表名、字段名&#xff08;colu…

1.3章节python中的注释和代码缩进

1.单行注释 2.多行注释 3.中文声明注释 4.代码缩进 在Python中&#xff0c;注释是用于解释代码或暂时禁用某些代码行的方法。Python支持两种类型的注释&#xff1a; 1.单行注释 使用#符号进行注释。在#符号之后的所有内容都会被Python解释器忽略。 # 这是一个单行注释 pr…