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)

转到 slot 0 和 rowoffset 4 以查看更改的数据

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

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

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

提前致谢

4

1 回答 1

0

日志行中的“0x06”

LOP_MODIFY_ROW  0x01    0x06        dbo.xyz1

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

于 2013-03-19T12:55:48.320 回答