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

news2025/1/20 13:31:32

一、引言

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

LeetCode刷题之HOT100之最大正方形

今天下起了暴雨,本以为下午就可以结束的答辩又因为老师开会被推迟。研三的学长走了后我们开始了0元购,收获颇丰哈哈,做个题 1、题目描述 2、算法分析 给定一个矩形,要求最大正方形。第一次见这种题目哈 2024 6/30 嘿嘿&#xff…

一区算法MPA|海洋捕食者算法原理及其代码实现(Matlab/Python))

Matlab/Python: 本文KAU将介绍一个2020年发表在1区期刊ESWA上的优化算法——海洋捕食者算法 (Marine Predators Algorithm,MPA)[1] 该算法由Faramarzi等于2020年提出,其灵感来源于海洋捕食者之间不同的觅食策略、最佳相遇概率策略、海洋记…

C++异常智能指针

目录 异常 异常的定义 异常的抛出和捕获 异常安全问题 异常的规范 智能指针 RAII思想 使用RAII的例子 智能指针 文件资源 在linux中管理锁资源 智能指针发展历程 auto_ptr unique_ptr shared_ptr 异常 异常的定义 异常是一种处理运行时错误的机制,它…

20240629在飞凌开发板OK3588-C上使用Rockchip原厂的SDK跑通I2C扩展GPIO芯片TCA6424ARGJRR

20240629在飞凌开发板OK3588-C上使用Rockchip原厂的SDK跑通I2C扩展GPIO芯片TCA6424ARGJRR 2024/6/29 18:02 1、替换DTS了: Z:\repo_RK3588_Buildroot20240508\kernel\arch\arm64\boot\dts\rockchip viewproviewpro-ThinkBook-16-G5-IRH:~/repo_RK3588_Buildroot2024…

Jedis、Lettuce、RedisTemplate连接中间件

jedis就像jdbc一样&#xff0c;用于两个端直接的连接。 1.创建Spring项目 这里不过多赘述... 2.导入连接工具jedis 在pom文件中导入jedis的依赖。 <dependency><groupId>redis.clients</groupId><artifactId>jedis</artifactId><version&…

【雷达原理】雷达测角原理及实现方法

目录 一、雷达测角原理1.1 测角研究历史和现状1.2 测角方法总结1.3 3DFFT测角1.3.1 基本原理1.2.2 测角性能 二、MATLAB仿真案例参考文献 一、雷达测角原理 1.1 测角研究历史和现状 &#xff08;1&#xff09;早期采用窄波束对准目标&#xff0c;目标的角度对应于天线的角度读…

Unity3D 转换微信小游戏指引 01

Unity3D 转换微信小游戏指引系列&#xff08;第一期&#xff09; 搭建环境 安装 WebGL 模块 首先&#xff0c;Unity 要安装WebGL Build Support模块。 在 Hub 找到安装的引擎&#xff0c;点击设置按钮&#xff0c;点击Add modules添加模块。 勾选WebGL Build Support&#…

股指期权交割日期是什么时候?在每个月几号?

今天带你了解股指期权交割日期是什么时候&#xff1f;在每个月几号&#xff1f;期权交割日是指合约到期之日&#xff0c;即投资者需要履行买卖合约的义务。 股指期权的交割日期通常是期权合约到期日的第三个星期五。如果这一天是公共假日&#xff0c;则交割日可能会提前到前一…

检索增强生成RAG系列3--RAG优化之文档处理

在上一章中罗列了对RAG准确度的几个重要关键点&#xff0c;主要包括2方面&#xff0c;这一章就针对其中一方面&#xff0c;来做详细的讲解以及其解决方案。 目录 1 文档解析1.1 文档解析工具1.2 实战经验1.3 代码演示 2 文档分块2.1 分块算法2.2 实战经验2.3 代码演示 3 文档e…

Workerman在线客服系统源码,附搭建教程

源码介绍&#xff1a; Workerman在线客服系统源码。 workerman是一个高性能的PHP socket 服务器框架&#xff0c;workerman基于PHP多进程以及libevent事件轮询库&#xff0c;PHP开发者只要实现一两个接口&#xff0c;便可以开发出自己的网络应用&#xff0c;例如Rpc服务、聊天…

基于Java的会员制医疗预约服务管理信息系统

你好呀&#xff0c;我是计算机学姐码农小野&#xff01;如果有相关需求&#xff0c;可以私信联系我。 开发语言&#xff1a;Java 数据库&#xff1a;MySQL 技术&#xff1a;Java技术ssm框架&#xff0c;结合JSPM工作流引擎 工具&#xff1a;IDEA/Eclipse、Navicat、Maven …

每日一题——Python实现PAT乙级1090 危险品装箱(举一反三+思想解读+逐步优化)4千字好文

一个认为一切根源都是“自己不够强”的INTJ 个人主页&#xff1a;用哲学编程-CSDN博客专栏&#xff1a;每日一题——举一反三Python编程学习Python内置函数 Python-3.12.0文档解读 题目链接&#xff1a;https://pintia.cn/problem-sets/994805260223102976/exam/problems/typ…

2024 vue3入门教程:windows系统下部署node环境

一、打开下载的node官网 Node.js — 下载 Node.js 二、根据个人喜好的下载方法&#xff0c;下载到自己的电脑盘符下 三、我用的是方法3下载的压缩包&#xff0c;解压到E盘nodejs目录下&#xff08;看个人&#xff09; 四、配置电脑的环境变量&#xff0c;新建环境变量的时候…

树莓派4B学习笔记17:RBG_LED全色域灯的驱动模块编写

今日继续学习树莓派4B 4G&#xff1a;&#xff08;Raspberry Pi&#xff0c;简称RPi或RasPi&#xff09; 本人所用树莓派4B 装载的系统与版本如下: 版本可用命令 (lsb_release -a) 查询: ​ Python 版本3.7.3&#xff1a; ​ 今日学习&#xff1a;RBG_LED全色域灯的驱动模块编写…

初学者轻松搞定19个经典的Python程序以及代码演示

Python的经典程序展示了Python语言基本特性和功能的简单示例,这些程序在学习和理解Python编程语言的过程中起着至关重要的作用. 一些常见的经典Python程序及其在学习Python时的功能&#xff1a; 1.Hello, World! print("Hello, World!")解释:这是Python的基本输出…

(单机架设教程)凯旋|当年的QQ游戏

前言 今天给大家带来一款单机游戏的架设&#xff1a;凯旋 &#xff0c; 当年的QQ游戏 如今市面上的资源参差不齐&#xff0c;大部分的都不能运行&#xff0c;本人亲自测试&#xff0c;运行视频如下&#xff1a; 凯旋单机 搭建教程 此游戏架设需要安装虚拟机&#xff0c; 没有…

【面试系列】Python 高频面试题

欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;欢迎订阅相关专栏&#xff1a; ⭐️ 全网最全IT互联网公司面试宝典&#xff1a;收集整理全网各大IT互联网公司技术、项目、HR面试真题. ⭐️ AIGC时代的创新与未来&#xff1a;详细讲解AIGC的概念、核心技术、…

基于源码详解ThreadPoolExecutor实现原理

个人博客地址 基于源码详解ThreadPoolExecutor实现原理 | iwts’s blog 内容拆分 这里算是一个总集&#xff0c;内容太多&#xff0c;拆分成几个比较重要的小的模块&#xff1a; ThreadPoolExecutor基于ctl变量的声明周期管理 | iwts’s blog ThreadPoolExecutor 工作线程…

【PL理论深化】(13) 变量与环境:文法结构 | 真假表达式:isZero E | let 表达式叠放 | 定义的规则 | 条件语句的使用

&#x1f4ac; 写在前面&#xff1a;从现在开始&#xff0c;让我们正式设计和实现编程语言。首先&#xff0c;让我们扩展在之前定义的整数表达式语言&#xff0c;以便可以使用变量和条件表达式。 目录 0x00 文法结构 0x01 真假表达式&#xff1a;isZero E 0x02 let 表达式叠…

1-5题查询 - 高频 SQL 50 题基础版

目录 1. 相关知识点2. 例题2.1.可回收且低脂的产品2.2.寻找用户推荐人2.3.大的国家2.4. 文章浏览 I2.5. 无效的推文 1. 相关知识点 sql判断&#xff0c;不包含null&#xff0c;判断不出来distinct是通过查询的结果来去除重复记录ASC升序计算字符长度 CHAR_LENGTH() 或 LENGTH(…