SQL Server 中的数据库或表的日志序列号 (LSN) 是否唯一?

rau*_*uts 2 sql-server change-data-capture

我正在使用 SQL CDC 来跟踪 SQL Server 中多个表的更改。我想以正确的顺序报告这些更改,因为我有一个程序从每个 CDC 表收集数据。但我想确保这些表发生的所有更改都按正确的顺序报告。我可以依靠 LSN 来获得正确的序列吗?

小智 5

LSN 号对于给定事务是唯一的,但不是全局唯一的。如果同一事务中有多个记录,它们将在 cdc 中共享相同的 __$start_lsn 值。如果您想要正确的操作顺序,您需要按 __$start_lsn、__$seqval、然后 __$operation 排序。__$seqval 表示包装事务中各个操作的 id。

例如,我在 dbo 模式中有一个名为 foo 的表。它有一个 y 列。如果我运行这个语句:

INSERT INTO dbo.foo VALUES (1); 
INSERT INTO dbo.foo VALUES (2);
Run Code Online (Sandbox Code Playgroud)

然后我将在 cdc 中看到两个单独的 LSN 值,因为它们位于两个单独的事务中。如果我运行这个:

BEGIN TRAN
INSERT INTO dbo.foo VALUES (1);
INSERT INTO dbo.foo VALUES (2);
COMMIT TRAN
Run Code Online (Sandbox Code Playgroud)

然后我将看到两条记录的一个 LSN 值,但它们将具有不同的 __$seqval 值,并且第一条记录的 seqval 将小于第二条记录的 seqval。