Sql server 更改数据捕获-$start\u lsn-解释此值

Sql server 更改数据捕获-$start\u lsn-解释此值,sql-server,sql-server-2008,change-data-capture,Sql Server,Sql Server 2008,Change Data Capture,当我查看其中一个CDC表时,我看到表中有四行的uuu$start_lsn值为0x000CB13700041C06001B 我的问题是。当SQL Server将包含此lsn的四行写入CDC表时,它是否只写入了具有此lsn的四行,或者下一个事务是否可能包含更多具有相同lsn的行 或者,换句话说,当我查看或查询某个特定LSN的CDC表时,我是否可以确定将来不会看到更多具有相同LSN的行 它是否只写了四行有这个lsn 对。考虑他们如何描述 对于典型的应用程序,查询更改数据将是一个持续的过程,定期请求自上

当我查看其中一个CDC表时,我看到表中有四行的uuu$start_lsn值为
0x000CB13700041C06001B

我的问题是。当SQL Server将包含此lsn的四行写入CDC表时,它是否只写入了具有此lsn的四行,或者下一个事务是否可能包含更多具有相同lsn的行

或者,换句话说,当我查看或查询某个特定LSN的CDC表时,我是否可以确定将来不会看到更多具有相同LSN的行

它是否只写了四行有这个lsn

对。考虑他们如何描述

对于典型的应用程序,查询更改数据将是一个持续的过程,定期请求自上次请求以来发生的所有更改。对于此类查询,您可以使用函数sys.fn\u cdc\u increment\u lsn从上一个查询的上限导出当前查询的下限。此方法确保不重复任何行,因为查询间隔始终被视为闭合间隔,其中两个端点都包含在间隔中。然后,使用函数sys.fn\u cdc\u get\u max\u lsn获取新请求间隔的高端点。请参阅模板“枚举自上次请求以来的所有更改”以获取示例代码,从而系统地将查询窗口移动到“获取自上次请求以来的所有更改”。

我的重点


超越当前更改集的技术是增加当前更改集中的最高lsn。然后你用它作为你的新下限。这是一种获取自上次请求以来所有更改的方法。因此,我们可以得出结论,任何进一步的更改都不可能具有与您已经看到的相同的lsn。

除了不信者Damien_的出色回答之外,我还要补充一点,lsn是数据库中更改的基本标识符。由此:

SQL Server事务日志中的每条记录都由日志序列号(LSN)唯一标识。LSN的排序方式是,如果LSN2大于LSN1,则LSN2引用的日志记录描述的更改发生在日志记录LSN描述的更改之后

(强调矿山)


你也可以从第二句话中推断出一些其他的东西。由于LSN固有的有序性,您可以在查询中按它们排序,并获得这些内容提交到日志的顺序。您还可以从该语句中推断出唯一性,只要LSN2=LSN1,那么这些记录将同时提交到日志中。

谢谢Damien。为了让我清楚地理解,我可以安全地假设,如果我在表中看到LSN为123的行(这永远不会),我可以确信,在下一个事务中或将来的任何时候,我都不会在表中看到更多具有相同LSN的行?