Sql server 如何在SQL Server的事务日志中查找回滚后更新事务的更改增量值
我试图理解mssql的事务日志的内部结构。 我做下面的交易Sql server 如何在SQL Server的事务日志中查找回滚后更新事务的更改增量值,sql-server,dbcc,Sql Server,Dbcc,我试图理解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]
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†††††††††††††...........
我们从内存转储中观察到,我们只找到回滚事务的值,即a=1
但我的问题是,我们如何在发生的转换中找到原始值,即6。这是微软没有故意将信息写入日志的行为,还是有任何方法??请建议
提前感谢日志行中的“0x06”
LOP_MODIFY_ROW 0x01 0x06 dbo.xyz1
是写入列的新值。由于事务被回滚,关于“6”的信息现在只在日志中,而不在页面缓冲区(内存)中。在内存中,始终存在该行的最新值(包括未完成的事务),该行可能受到逻辑锁(有时是闩锁)的保护