讲解一下如何设计一个事务的日志文件。我知道日志管理程序的四个接口:open/close、read/insert。但是现在,我需要实现一个模拟的 日志文件,简单即可。
日志文件是由一条条日志记录构成的顺序文件,
一般的日志记录结构:日志序号,事务trid,操作类型(sql里面的增删改),操作对象,旧值,新值。
但是,我还需要另外一种日志记录:保存点日志记录(在事务执行过程中会在状态转变时都写入一个这样的日志记录)。保存点的日志记录格式大概包括:保存点记录类型,保存点序号,事务状态,提交类型,参与的资源管理器...首先,请告知日志文件的后缀名,其次,给出日志记录的设计。
事务日志保存点

解决方案 »

  1.   

    Jim Gray的名著还没搞到吗?里面写得很清楚的。
      

  2.   

    请告知日志文件的后缀名,
    --> *.ldf其次,给出日志记录的设计。
    --> 请参考以下SQL执行结果的字段设计..
    select * from fn_dblog(null,null)DBCC log(DBAP)
      

  3.   


    存储引擎不是那么好实现的,建议先对存储引擎的引用方面有比较深的理解之后再去玩它的实现机制,这样会更加容易一点。
    http://www.cs.berkeley.edu/~brewer/cs262/Aries.pdf
    http://research.microsoft.com/~gray/WICS_99_TP/10a_log.ppt
    http://research.microsoft.com/~gray/WICS_99_TP/10b_RM.ppt
    FYI
      

  4.   

    Jim Gray的名著还没搞到吗?里面写得很清楚的。里面没有写日志文件怎么设计。特别是普通的日志记录和保存点日志记录的存储区别。
      

  5.   


    存储引擎不是那么好实现的,建议先对存储引擎的引用方面有比较深的理解之后再去玩它的实现机制,这样会更加容易一点。
    http://www.cs.berkeley.edu/~brewer/cs262/Aries.pdf
    http://research.microsoft.com/~gray/WICS_99_TP/10a_log.ppt
    http://research.microsoft.com/~gray/WICS_99_TP/10b_RM.ppt
    FYI资料确实很好,不过我看过中文(2、3)的了。我就是面对一个两种格式的日志记录不知道如何设计一个日志文件。
      

  6.   

    Jim Gray的名著还没搞到吗?里面写得很清楚的。里面没有写日志文件怎么设计。特别是普通的日志记录和保存点日志记录的存储区别。
    1,关于日志文件的格式,以及怎么读log_read_lsn,怎么写log_insert,上面的第二。三个URL里已经写的很清楚了,怎么REDO,怎么UNDO, 不再赘述。 Aries也已经用源码来说明了 crash recovery的3个阶段了。2,关于savepoint log的记录格式跟普通日志的差别,主要是=前者有savepoint number,用来标记某个savepoint ,但是没有body,的结构大约这样。
    struct
    {
     int savepoint number --表示某个savepoint 
     list<RMtranscb> RMs 参与的资源管理器,
    等....
    }
    如果你那个rollback到某个savepoint ,把那个savepoint 对应的number穿进去,然后调用事务管理其跟资源管理器UNDO好了。
      

  7.   

    Jim Gray的名著还没搞到吗?里面写得很清楚的。里面没有写日志文件怎么设计。特别是普通的日志记录和保存点日志记录的存储区别。
    1,关于日志文件的格式,以及怎么读log_read_lsn,怎么写log_insert,上面的第二。三个URL里已经写的很清楚了,怎么REDO,怎么UNDO, 不再赘述。 Aries也已经用源码来说明了 crash recovery的3个阶段了。2,关于savepoint log的记录格式跟普通日志的差别,主要是=前者有savepoint number,用来标记某个savepoint ,但是没有body,的结构大约这样。
    struct
    {
     int savepoint number --表示某个savepoint 
     list<RMtranscb> RMs 参与的资源管理器,
    等....
    }
    如果你那个rollback到某个savepoint ,把那个savepoint 对应的number穿进去,然后调用事务管理其跟资源管理器UNDO好了。保存点记录要写到日志文件里吧?因为UNDO的时候要读日志记录,比如提交完成的保存点记录来区分这个事务可不可以回滚?所以要放到日志文件里面吧。
      

  8.   

    肯定要插入savepoint的日志,你在调用savepoint()的时候就会保存savepoint日志,同时这个被保存的savepoint日志有savepoint number,比如你要rollback到target savepoint number,UNDO的时候,会从maximum lsn开始回退,同时根据LSN读取savepoint number,当碰到日志的中含有的savepoint number<=target savepoint number的时候,停止rollback.
      

  9.   

    @ixubingaihong 
    顺便说一下,ARIES里中的Total or Partial Rollbacks那个section,有完整的代码,讲诉的就是savepoint的rollback,仔细的看一下。