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