我正在尝试了解 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。这是微软不故意将信息写入日志的行为还是有什么办法?请建议。
提前致谢