当我查看我们的一个 CDC 表时,我看到表中有四行 __$start_lsn 值为0x000CB13700041C06001B
.
我的问题是这个。当 SQL Server 将包含此 lsn 的四行写入 CDC 表时,它是否仅写入了将具有此 lsn 的四行,或者下一个事务可能包含更多具有相同 lsn 的行?
或者,换一种说法,当我查看或查询特定 LSN 的 CDC 表时,我能否确定将来我不会看到更多具有相同 LSN 的行?
当我查看我们的一个 CDC 表时,我看到表中有四行 __$start_lsn 值为0x000CB13700041C06001B
.
我的问题是这个。当 SQL Server 将包含此 lsn 的四行写入 CDC 表时,它是否仅写入了将具有此 lsn 的四行,或者下一个事务可能包含更多具有相同 lsn 的行?
或者,换一种说法,当我查看或查询特定 LSN 的 CDC 表时,我能否确定将来我不会看到更多具有相同 LSN 的行?
它写了仅有的四行会有这个 lsn
是的。考虑他们如何描述查询自上次更改集以来的所有新更改
对于典型的应用程序,查询更改数据将是一个持续的过程,定期请求自上次请求以来发生的所有更改。对于此类查询,您可以使用该函数
sys.fn_cdc_increment_lsn
从前一个查询的上限派生当前查询的下限。此方法确保不会重复任何行,因为查询间隔始终被视为封闭间隔,其中两个端点都包含在间隔中。然后,使用该函数sys.fn_cdc_get_max_lsn
获取新请求间隔的高端。有关示例代码,请参阅模板 Enumerate All Changes since Previous Request 以系统地移动查询窗口以获取自上次请求以来的所有更改。
(我的重点)
超越您正在查看的当前更改集的技术是增加当前集中的最高 lsn。然后你用它作为你的新下限。这被描述为一种获取自上次请求以来所有更改的方法。因此,我们可以得出结论,没有进一步的更改可能具有与您已经看到的相同的 lsn。
除了 Damien_The_Unbeliever 的出色回答之外,我还要补充一点,LSN 是数据库中更改的基本标识符。从这篇BOL 文章:
SQL Server 事务日志中的每条记录都由日志序列号 (LSN)唯一标识。LSN 是这样排序的,如果 LSN2 大于 LSN1,则 LSN2 所引用的日志记录所描述的更改发生在日志记录 LSN 所描述的更改之后。
(强调我的)
您还可以从第二句话中推断出其他一些事情。由于 LSN 固有的可排序性,您可以在查询中按它们进行排序,并且您会获得将这些内容提交到日志的顺序。您还可以从这条语句中推断出唯一性,如果 LSN2 = LSN1,那么这些记录会同时提交到日志中。