2013-03-19 32 views
4

我想了解mssql的tranaction日志的内部。 我做了以下交易如何在SQL Server的事务日志中完成回滚后更新事务找到更改的增量值

Begin TRANSACTION 
update xyz1 set a=6 
Rollback TRANSACTION 

最初列'a'的值是5。因此事务的结果被发现如下所示使用

SELECT 
    Operation, [RowLog Contents 0], [RowLog Contents 1, AllocUnitName, [Page ID], 
    [Slot ID], [Offset in Row],[Transaction ID] 
FROM 
    sys.fn_dblog(NULL,NULL) 

operation   rowcontent0 row content 1  AllocUnitName Page ID  Slot ID Offset  
LOP_BEGIN_XACT NULL NULL  NULL  NULL    NULL 
LOP_MODIFY_ROW 0x01 0x06  dbo.xyz1  0001:0000022e 0 4 
LOP_MODIFY_ROW 0x 0x01  dbo.xyz1  0001:0000022e 0 4 
LOP_ABORT_XACT NULL NULL  NULL  NULL    NULL 

正如我们从这些数据中发生变化,从1至6,并再次其改为1,因为回滚已发生上述值看到。

然后得到我使用下面的命令,其中558(22E)是页面ID可以在上表

dbcc traceon(3604) 
dbcc page(lumrecon,1,558,3) 

去找到到时隙0和rowoffset 4看到的数据存储器中的信息已更改

00000000: 10000800 01000000 010000†††††††††††††...........  

我们从内存转储中观察到,我们仅查找回滚事务的值,即a = 1。

但我的问题是我们如何找到原始值,即在发生的tranaction中的6。这是不是有意将信息写入日志的微软行为,或者有什么办法?请建议。

在此先感谢

回答

0

日志行

LOP_MODIFY_ROW 0x01 0x06  dbo.xyz1 

中的“0×06”被写入列的新值。由于事务回滚,所以关于“6”的信息现在只在日志中,而不在页面缓冲区(内存)中。在内存中总是存在行的最新值(包括未完成的事务),可能受逻辑锁和有时锁存器的保护。