从 CLFS 流读取数据记录

通用日志文件系统(CLFS)流中有两种类型的记录:数据记录和重启记录。 本文介绍如何从流中读取一系列数据记录。 有关如何读取重启记录的信息,请参阅 从 CLFS 流读取重启记录

在从流中读取一系列数据记录时,有几种不同的变体。 可以在流中从指定记录中向前读取,也可以沿着链接记录链向后读取。

有关读取数据记录序列的所有变体,请完成以下步骤。

  1. 调用 ClfsReadLogRecord 以获取读取上下文和序列中的第一条数据记录。

  2. 将步骤 1 中获取的读取上下文传递给 ClfsReadNextLogRecord 重复获取序列中的剩余数据记录。

注意

读取上下文不是线程安全的。 客户端负责序列化对读取上下文的访问。

以下子主题讨论读取不同类型的记录序列和链的详细信息。

从指定的数据记录向前读取

若要在 CLFS 流中向前读取(从所选的数据记录开始),必须创建其模式设置为 ClfsContextForward 的读取上下文。 若要创建读取上下文并读取第一条记录(在所选读取的集中),请调用 ClfsReadLogRecord ,如下表所示。

参数名称 价值
pvMarshalContext 提供指向封送区域的指针。
plsnFirst 提供要读取的第一条记录的 LSN(日志序列号)。 这必须是数据记录的 LSN,而不是重启记录。
peContextMode 提供 ClfsContextForward 值。
ppvReadBuffer 接收您的记录数据。
pcbReadBuffer 获取记录数据的大小。
peRecordType 接收记录类型。 此值是一组标志,指示该记录的各个特征。 该记录是一个数据记录,因此收到的值应设置 ClfsDataRecord 标志,并清除 ClfsRestartRecord 标志。
plsnUndoNext 接收数据记录的 undo-next LSN。 无需此值即可继续读取链,因此可以忽略它。
plsnPrevious 获取数据记录的上一个日志序列号(LSN)。 无需此值即可继续读取链,因此可以忽略它。
ppvReadContext 接收指向不透明读取上下文的指针。 使用读取上下文读取后续记录。

获取读取上下文和第一条记录后,可以通过重复调用 ClfsReadNextLogRecord 来获取流中的后续记录。 当流中没有更多数据记录时, ClfsReadNextLogRecord 将返回STATUS_END_OF_FILE。 下表显示了如何设置和解释参数。

参数名称 价值
pvReadContext 提供一个指向从 ClfsReadLogRecord 接收到的读取上下文的指针。
ppvBuffer 接收记录数据。
pcbBuffer 获取记录数据的大小。
peRecordType 提供 ClfsDataRecord 的值。
plsnUndoNext 接收数据记录的下一个 LSN 字段。 无需此值即可继续读取链,因此可以忽略它。
plsnPrevious 接收数据记录的上一个 LSN 字段。 无需此值即可继续读取链,因此可以忽略它。
plsnRecord 获取已读取的数据记录的 LSN。

读取上一 LSN 链接的数据记录链

将数据记录写入 CLFS 流时,可以将数据记录的上一个 LSN 设置为以前写入流的任何记录的 LSN。 通过设置之前的 LSN,可以创建一个相关记录链,这些记录以后可以按相反顺序遍历。 例如,假设要执行数据库事务,并且必须编写多个 CLFS 日志记录来描述事务进行的更新。 每次编写描述事务更新的日志记录时,都可以将记录的上一个 LSN 设置为上一个日志记录的 LSN,以描述同一事务进行的更新。

假设你编写了一系列由其以前的 LSN 链接的数据记录。 若要读取记录链,必须创建一个已将其模式设置为 ClfsContextPrevious 的读取上下文。 若要创建读取上下文并读取链中的第一条记录,请调用 ClfsReadLogRecord ,如下表所示。

参数名称 价值
pvMarshalContext 提供指向编组区域的指针。
plsnFirst 提供链中第一条记录的 LSN。 这必须是数据记录的 LSN,而不是重启记录。
peContextMode 提供 ClfsContextPrevious 的值。
ppvReadBuffer 接收记录数据。
pcbReadBuffer 接收记录数据的大小。
peRecordType 接收记录类型。 此值是一组标志,指示记录的各种特征。 该记录是一个数据记录,因此收到的值应设置 ClfsDataRecord 标志,并清除 ClfsRestartRecord 标志。
plsnUndoNext 接收数据记录的撤消下一步 LSN。 无需此值即可继续读取链,因此可以忽略它。
plsnPrevious 接收数据记录的上一个 LSN。 无需此值即可继续读取链,因此可以忽略它。
ppvReadContext 接收指向不透明读取上下文的指针。 使用读取上下文来读取链中之前的记录。

读取上下文和第一条记录后,可以通过重复调用 ClfsReadNextLogRecord 来读取链中的剩余记录。 下表显示了如何设置和解释参数。

参数名称 价值
pvReadContext 提供一个指向从 ClfsReadLogRecord 接收到的读取上下文的指针。
ppvBuffer 接收记录数据。
pcbBuffer 接收记录数据的大小。
peRecordType 提供 ClfsDataRecord 的值。
plsnUndoNext 接收数据记录的撤消下一步 LSN。 无需此值即可继续读取链,因此可以忽略它。
plsnPrevious 接收数据记录的上一个 LSN。 无需此值即可继续读取链,因此可以忽略它。
plsnRecord 获取已读取的数据记录的 LSN。

ClfsReadNextLogRecord 进行重复调用时,调用序列以下列方式之一结束。

  • 最终,您读取的数据记录,其以前的LSN设置为CLFS_LSN_INVALID。 下次调用 ClfsReadNextLogRecord 时,它将返回STATUS_END_OF_FILE。

  • 最终,你读取了一条数据记录,该记录的以前的 LSN 小于流的基 LSN 和流的 存档尾部。 下次调用 ClfsReadNextLogRecord 时,它将返回STATUS_LOG_START_OF_LOG。

读取由撤消下一个 LSN 链接的数据记录链

将数据记录写入 CLFS 流时,可以将数据记录的下一个撤消 LSN 设置为之前写入该流的任何记录的 LSN。 通过设置“撤消下一个 LSN”,可以创建一个能够按逆序遍历的相关记录链。 有关创建和解释撤消下一个链的详细信息,请参阅 CLFS 日志序列号

假设你编写了一系列由其撤消的下一个 LSN 链接的数据记录。 若要读取记录链,必须调用 ClfsReadLogRecord 来创建其模式设置为 ClfsContextUndoNext 的读取上下文。 之后,该过程与读取由先前 LSN 连接的链相同(如前文所述)。

读取用户 LSN 链接的数据记录链

除了之前 LSN 链接的链和撤消下一个 LSN 之外,还可以创建由自己的 LSN 链接的链,这些链由嵌入到记录数据中的 LSN 链接。

假设你已经创建了一系列数据记录,这些记录通过存储在记录数据本身中的 LSN(日志序列号)进行链接。 若要读取记录链,必须创建一个已将其模式设置为 ClfsContextPreviousClfsContextUndoNext 的读取上下文。 通过调用 ClfsReadLogRecord 创建读取上下文并获取链中最近写入的记录。 然后重复调用 ClfsReadNextLogRecord 以获取链中的前一条记录。 每次调用 ClfsReadNextLogRecord 时,将 plsnUser 参数设置为链中上一条记录的 LSN。 plsnUser 中提供的 LSN 将替代存储在当前记录的上一个 LSN 或撤消下一个 LSN 字段中的任何值。

只有在调用 ClfsReadNextLogRecord 来读取记录链时,才能在流中向后移动。 plsnUser 中提供的 LSN 必须小于链中当前记录的 LSN。

另请参阅

archive tail

CLFS 日志序列号

ClfsReadLogRecord

ClfsReadNextLogRecord

从 CLFS 流读取重启记录