Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 如何在SQL Server的事务日志中查找回滚后更新事务的更改增量值_Sql Server_Dbcc - Fatal编程技术网

Sql server 如何在SQL Server的事务日志中查找回滚后更新事务的更改增量值

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]

我试图理解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†††††††††††††...........     
我们从内存转储中观察到,我们只找到回滚事务的值,即a=1

但我的问题是,我们如何在发生的转换中找到原始值,即6。这是微软没有故意将信息写入日志的行为,还是有任何方法??请建议

提前感谢

日志行中的“0x06”

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