2013-03-19 82 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」的信息現在只在日誌中,而不在頁面緩衝區(內存)中。在內存中總是存在行的最新值(包括未完成的事務),可能受邏輯鎖和有時鎖存器的保護。