当前位置: 首页 > news >正文

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

一、引言

利用前面所建立的冗余数据,即日志和数据库备份,要将数据库从一个不一致的错误状态恢复到一个一致性状态,还需要相关的恢复策略,不同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.lryc.cn/news/387427.html

相关文章:

  • 【鸿蒙学习笔记】位置设置
  • 41.HOOK引擎设计原理
  • STM32启动流程 和 map文件的作用
  • 深度解析华为仓颉语言
  • Android简介-历史、API等级与体系结构
  • SpringBoot:使用Spring Batch实现批处理任务
  • 用JQueryUI库在.net MVC中配置datepicker(时间日期控件)
  • 算法:链表
  • Redis基础教程(一):redis配置
  • 短视频矩阵系统:打造品牌影响力的新方式
  • 品牌推广的三个阶段与核心内容,一篇文章全掌握!
  • 队列与循环队列
  • python基础问题记录
  • Qt之饼图(Pie Graph)
  • Java项目Git提交规范
  • flink-触发器Trigger和移除器Evictor
  • 【力扣 28】找出字符串中第一个匹配项的下标 C++题解(字符串匹配)
  • 软件构造 | Design Patterns for Reuse and Maintainability
  • Python数据分析-股票分析和可视化(深证指数)
  • Linux如何安装openjdk1.8
  • 【LLVM】LTO学习
  • 事务的特性-原子性(Atomicity)、一致性(Consistency)、隔离性(Asolation)、持久性(Durability)
  • redis哨兵模式(Redis Sentinel)
  • 【牛客】牛客小白月赛97 题解 A - E
  • Spring Boot中泛型参数的灵活运用:最佳实践与性能优化
  • MySQL建表时的注意事项
  • Advanced RAG 09:『提示词压缩』技术综述
  • (13)DroneCAN 适配器节点(二)
  • 摸鱼大数据——Spark基础——Spark环境安装——Spark Local[*]搭建
  • 函数内部结构分层浅析(从MVC分层架构联想)