首页 > 其他分享 >Undo log日志回放

Undo log日志回放

时间:2023-06-19 10:01:03浏览次数:40  
标签:事务 log Undo T1 Tn CKPT commit 日志


引言:一个看起来正确的过程

系统宕机后需要重启,重启过程中需要对事务涉及到的数据进行“整理”,包括:

1. 宕机时刻尚未提交的事务对数据的修改需要回滚


实现整理的过程称之为“日志回放”。通过从后向前回放Undo Log日志,直到找到commit点为止,这样就保证了数据一致性。


上面的过程看起来很完美。真的完美吗?问题出在这里:如果系统中同时有多个事务在执行,Undo Log中的commit点该如何定义呢?可能存在多个等待Commit的点。

(继续之前考虑一下Global Serializability,多个commit点与此冲突吗?)



实战:可以工作的过程

方法1:系统重启回放日志,只需要从后往前扫描日志文件,对于所有没有commit的事务按照日志记录中的数据做回滚操作。

这个方法肯定是可以工作的,其问题在于要求扫描所有commit日志,代价不菲。


方法2:使用Checkpoint,拉起一个大栅栏。

Checkpoint可以看做是对引言中“commit点“的展开,它好比一个较宽的栅栏(fence),将所有已经开始、尚未commit的事务都记录下来,等待这些事务完成之后再在日志中写入一条“在这个栅栏架起来之前的那些状态一致了”的标记。 为什么是“架起来之前的”呢?因为在架起栅栏后有一段等待事务完成时间,这段时间里会有新的事务发起,他们也会继续写日志,对于这些事务Checkpoint不关注。


生成checkpoint的过程:

1. 在日志中写下CREATE_CKPT(T1,T2,..,Tn),其中Ti表示写入CREATE_CKPT之前尚未完成的事务

2. 等待T1~Tn这些事务完成。在等待过程中可能会有新的事务写日志。

3. 在日志中写入END_CKPT


日志回放过程:

1. 从后往前扫描日志,如果先遇到END_CKPT,那么说明CREATE_CKPT中记录的T1~Tn这些事务都已经完成,将日志回放至CREATE_CKPT处即可。之前的日志均可以丢弃。如果先遇到CREATE_CKPT,那么说明T1~Tn这些事务可能还有没完成的,那么为了保证Global Serialization,将日志回滚到T1~Tn中最早出现的那一条之前即可。例如T3是T1~Tn中最先开始的事务,则将事务回滚检查做到T3之前即可,因为T3前的所有数据均已经确保Commit了。


剩余问题:

如何保证事务的Global Serializability?



参考文献:无施的 http://nosql-wiki.org/foswiki/bin/view/Main/TransactonLog



标签:事务,log,Undo,T1,Tn,CKPT,commit,日志
From: https://blog.51cto.com/maray/6510916

相关文章

  • sql server 转移日志文件
    sqlserver转移日志文件要将SQLServer的日志文件转移到不同的位置,你可以按照以下步骤进行操作:1.首先,通过执行以下查询,获取当前数据库的日志文件的逻辑名称(LogicalName):  ```sql  USEYourDatabaseName;  SELECTname,physical_nameFROMsys.master_filesWHEREt......
  • 关于lvm磁盘管理中lv-logical-volume逻辑卷的创建-新建
    在lvm-(LogicalVolumeManager)-逻辑卷管理的简写),在磁盘管理体系中,有一个lv的概念lv即是logicalvolume逻辑卷的缩写,今天笔者主要讲解一下关于lv的创建过程 在创建之前,需要有几个知识点需要明白一下1、lv是从vg中进行创建的,一个操作系统中,是可以有多个vg的2、因此在创建......
  • 快速查看日志的方法
    快速查看日志的方法摘要本文主要是仿写自:https://www.cnblogs.com/codelogs/p/16410363.html原创:扣钉日记(微信公众号ID:codelogs)感觉公众号作者的文章挺好的.周末在家看了一些,感觉很有收获的确能够解决自己遇到的一些问题但是感觉早上六点多看完,到了中午就忘记的差不......
  • Python学习日志一,初识Python
    一、向python说你好世界(print("Helloworld!!"))二、pycharm插件推荐使用上图这个插件就可以翻译代码里面的英文单词了三、Pycharm常用快捷键ctrl+alt+s:打开软件设置shift+alt+上/下:将当前行代码上移或者下移Ctrl+shift+f10:运行当前代码f6:重命名文件四......
  • log4cxx的使用模式
    log4cxx的使用模式(金庆的专栏)==初始化配置==Main.cpp中初始化配置.如果不需要监视配置文件并自动重新配置,就不需要调用configureAndWatch().执行目录下的log4j.properties是会自动读取的。#include<log4cxx/propertyconfigurator.h>intma......
  • MATH is the LOGIC OF CERTAINTY and STATISTICS is the LOGIC OF UNCERTAINTIES
    Statistics110ofHarvardUniversity: Mathisthelogicofcertainty,Statisticsisthelogicofuncertainty. Strategicpractice:Clarity;Honesty......
  • Loguru:优雅的日志管理模块
    安装pip3installloguru日志等级等级方法TRACElogger.trace()DEBUGlogger.debug()INFOlogger.info()SUCESSlogger.sucess()WARNINGlogger.warnning()ERRORlogger.error()CRITICALlogger.critical()基本使用fromloguruimportlogger......
  • BLOG-3
    通过对最后三次大作业中的题目集的学习,我有以下心得:1.三次题目集的知识点我觉得有这些(1):输入语句的使用。  (2):java中多个if()判断语句的使用。(3):java中的if()和else语句的嵌套使用。......
  • SummerResearch_Log_20230617
    WorkingContent:1.今天还是读代码,对于代码有以下问题:(1)FCNet最后的输出层只有1个神经元,这如何做分类?——解决了,应该是因为它每个子任务都是训练两类,所以只需要一个神经元确定是哪个类别。(2)CIFAR数据集的分任务是什么情况?既使用了CIFAR10也使用了CIFAR100,并且分类的情况也有点......
  • Logback SiftingAppender 使用
    1、简介SiftingAppender可根据给定的运行时属性将日志分离或筛选。例如,SiftingAppender可以根据用户会话将日志事件分开,以便不同用户生成的日志进入不同的日志文件,每个用户一个日志文件。SiftingAppender有两个属性:timeoutSiftingAppender会关闭并取消引用超时(连续多长时......