2010-02-21 68 views

回答

6

数据库中的每个更新都会首先向包含更改描述的日志写入条目。例如。如果将列值从A更新为B,则日志将包含更新的记录,如下所示:在表T中,C列从A更改为B,记录的密钥K通过ID为I的事务进行记录。如果回滚事务时,引擎将开始扫描日志以查找事务完成的工作记录,并撤销该工作:当它找到从A更新为B的记录时,会将该值更改回A.插入将被撤消通过删除插入的行。通过插回行删除将被撤消。这在Transaction Log Logical ArchitectureWrite-Ahead Transaction Log中有描述。

这是高层次的解释,确切的内部细节如何发生这种情况,对于外行人而言是没有文件证明的,不受您的检查或更改。

+0

因此,关于无证的正确,我有一个母马试图解码LOP_MODIFY_COLUMNS :) – Andrew 2010-02-22 10:34:58

3

在它是怎么做的,所有的事务中的数据修改存储在事务日志中,有额外的空间还保留在日志中撤销记录中,因为它具有回滚事件术语。 每个事务日志都有足够的信息来反转已做的更改,以便它可以在需要时撤消更改。 (除了重播它们在DR方案)

如果我们举一个简单的删除操作为例(因为我已经decoded that here作为日志内容的一个示例)被删除存储在事务日志条目中记录的LOP_DELETE_ROWS和一些不平凡的努力,你可以解码和演示整个行是在日志条目。

如果要回滚事务,将使用日志中保留的撤消空间,并重新插入该行。撤销空间保留的原因是为了确保事务日志不能在事务处理完成时被填满,从而无法完成或回滚空间。

+0

感谢Andrew的帮助。 如何从日志表中获取存储的数据? – 2010-02-21 14:06:03

+2

在查看它的过程中,select * from :: fn_dblog(null,null)就实际解释而言,你真的无法做到 - 它在任何实际的形式中都不是人类可读的。有第三方工具可以读取日志,或者您可以阅读奇怪的条目以获得“兴趣/理解”的视角,但是在该级别上没有任何关于该主题的文档 – Andrew 2010-02-21 14:08:16