当前位置:  数据库>oracle

UNDO类型日志系统浅浅理解

    来源: 互联网  发布时间:2017-06-23

    本文导语: 日志系统是保证数据库管理系统正确执行事务的基本机制。根据作用的不同,日志系统分为UNDO和REDO两种,本文对UNDO类型日志的原理进行简单模拟说明。 1 UNDO日志要求 日志记录了数据修改之前的旧值; 数据刷盘之前,把日志...

日志系统是保证数据库管理系统正确执行事务的基本机制。根据作用的不同,日志系统分为UNDO和REDO两种,本文对UNDO类型日志的原理进行简单模拟说明。

1 UNDO日志要求
  • 日志记录了数据修改之前的旧值;
  • 数据刷盘之前,把日志刷盘;(一致性)
  • 数据刷盘之后,把日志COMMIT刷盘。(持久性)
2 UNDO日志缺陷

UNDO日志提供了足够的信息可以保证事务的一致性和持久性。但是,为了保持一致性,采取的是被动保守的策略,即:用旧值覆盖不能确保成功的事务。未成功的事务不能重新执行,只能恢复到事务之前的一致状态。

2 模拟代码

只是模拟了数据写入的过程,没有模拟数据恢复过程,待以后有时间补充。

/* UNDO 类型日志基本流程模拟 */

#include 
#include 
#include 
#include 

/* 日志文件,基本格式:
 * T1_START
 * A=100
 * B=100
 * T1_COMMIT
 */

#define LOG_FILE "test.log"

/* 数据文件,基本格式: 每行一个键值对,长度固定为1024,右侧用空格填充。 
 * A=100     (padding)
 * B=100     (padding)
 */
#define DATA_FILE "test.data"

#define LINE_MAX 1024

/* 键值对 */
typedef struct KV KV;
struct KV
{
    char* key;
    char* value;
};

/* 从硬盘读取名为k的数据 */
static int fread_kv(char* k, char* v, FILE* fp)
{
    rewind(fp);
    char line[LINE_MAX+1]={0};
    int lineNo = 0;
    while(fread(line, 1, LINE_MAX, fp)==LINE_MAX){
        int i=0;
        while(k[i] && line[i]!='='){
            if(k[i] != line[i]){
                break;
            }
            i++;
        }
        if(line[i] == '='){
            strcpy(v, &line[i+1]);
            return lineNo;
                                                                                                                                                                    1,1           Top        }
        lineNo ++;
    }
    return -1;
}
/* 把数据刷入硬盘 */
static void fwrite_kv( char* k,  char* v, FILE* fp)
{
    int lineNo = -1;
    char newLine[LINE_MAX];
    sprintf(newLine, "%s=%s", k, v);
    int offset = 0;
    if( (lineNo=fread_kv(k,v,fp))

    
 
 

您可能感兴趣的文章:

 
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • java命名空间javax.swing.undo类stateedit的类成员方法: undo定义及介绍
  • Oracle 管理Undo数据
  • java命名空间javax.swing.undo接口undoableedit的类成员方法: undo定义及介绍
  • semop不使用SEM_UNDO的问题
  • java命名空间javax.swing.undo类undomanager的类成员方法: undo定义及介绍
  • Oracle释放undo表空间
  • java命名空间javax.swing.undo类abstractundoableedit的类成员方法: undo定义及介绍
  • linux command无法撤消mv命令,在linux下没有undo.刚google下,看到老外说的一句比较经典的话。
  • java命名空间javax.swing.text类defaultstyleddocument.attributeundoableedit的类成员方法: undo定义及介绍
  • [Oracle] 解析在没有备份的情况下undo损坏怎么办
  • java命名空间javax.swing.text类abstractdocument.defaultdocumentevent的类成员方法: undo定义及介绍
  • 如何Shrink Undo表空间,释放过度占用的空间
  • java命名空间javax.swing.text类abstractdocument.elementedit的类成员方法: undo定义及介绍
  • Oracle undo_management参数不一致错误
  • java命名空间java.awt.event类keyevent的类成员方法: vk_undo定义及介绍
  • java命名空间javax.swing.undo类compoundedit的类成员方法: edits定义及介绍
  • java命名空间javax.swing.undo接口undoableedit的类成员方法: getundopresentationname定义及介绍
  • java命名空间javax.swing.undo类undomanager的类成员方法: edittobeundone定义及介绍
  • java命名空间javax.swing.undo类undomanager的类成员方法: canundoorredo定义及介绍
  • java命名空间javax.swing.undo类undomanager的类成员方法: undoorredo定义及介绍
  • java命名空间javax.swing.undo类stateedit的类成员方法: poststate定义及介绍


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3