4

mssql のトランザクション ログの内部を理解しようとしています。私は次の取引を行います

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 と行オフセット 4 に移動して、データが変更されたことを確認します

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

メモリ ダンプから、ロールバックされたトランザクションの値、つまり =1 しか見つからないことがわかります。

しかし、私の質問は、発生したトランザクションで元の値、つまり 6 をどのように見つけるかです。これは意図的にログに情報を書き込まないマイクロソフトの動作ですか、それとも何か方法はありますか?? 提案してください 。

前もって感謝します

4

1 に答える 1

0

ログ行の「0x06」

LOP_MODIFY_ROW  0x01    0x06        dbo.xyz1

列に書き込まれる新しい値です。トランザクションがロールバックされたため、"6" に関する情報は、ページ バッファー (メモリ) ではなく、ログにのみ記録されます。メモリ内には常に行の最新の値 (未完了のトランザクションを含む) があり、論理ロックや場合によってはラッチによって保護される可能性があります。

于 2013-03-19T12:55:48.320 に答える