从 CLFS 流读取数据记录
通用日志文件系统中 (CLFS) 流中有两种类型的记录:数据记录和重启记录。 本主题说明如何从流中读取一系列数据记录。 有关如何读取重启记录的信息,请参阅 从 CLFS 流读取重启记录。
从流中读取一系列数据记录有几种变化。 可以在流中从指定记录向前读取,也可以沿着链接记录链向后读取。
对于读取一系列数据记录的所有变体,请完成以下步骤。
调用 ClfsReadLogRecord 以获取读取上下文和序列中的第一条数据记录。
重复将步骤 1 中获取的读取上下文传递给 ClfsReadNextLogRecord ,以获取序列中的剩余数据记录。
谨慎 读取上下文不是线程安全的。 客户端负责序列化对读取上下文的访问。
以下子主题讨论读取不同类型的记录序列和链的详细信息。
从指定的数据记录向前读取
若要从所选) 的数据记录开始,在 CLSF 流 (中向前读取,必须创建其模式设置为 ClfsContextForward 的读取上下文。 若要创建读取上下文并读取已选择读取) 集中的第一条记录 (,请调用 ClfsReadLogRecord ,如下表所示。
参数名称 | 值 |
---|---|
pvMarshalContext |
提供指向封送区域的指针。 |
plsnFirst |
提供要读取的第一条记录的 LSN。 这必须是数据记录的 LSN,而不是重启记录。 |
peContextMode |
提供值 ClfsContextForward。 |
ppvReadBuffer |
接收记录数据。 |
2016 年 12 月 1 日 |
接收记录数据的大小。 |
peRecordType |
接收记录类型。 此值是一组指示记录的各种功能的标志。 记录是一条数据记录,因此收到的值应设置 ClfsDataRecord 标志,并清除 ClfsRestartRecord 标志。 |
plsnUndoNext |
接收数据记录的撤消下一个 LSN。 无需此值即可继续读取链,因此可以忽略它。 |
plsnPrevious |
接收数据记录的上一个 LSN。 无需此值即可继续读取链,因此可以忽略它。 |
ppvReadContext |
接收指向不透明读取上下文的指针。 使用读取上下文读取后续记录。 |
获取读取上下文和第一条记录后,可以通过重复调用 ClfsReadNextLogRecord 来获取流中的后续记录。 当流中没有更多数据记录时, ClfsReadNextLogRecord 返回STATUS_END_OF_FILE。 下表显示了如何设置和解释参数。
参数名称 | 值 |
---|---|
pvReadContext |
提供指向从 ClfsReadLogRecord 收到的读取上下文的指针。 |
ppvBuffer |
接收记录数据。 |
2013 |
接收记录数据的大小。 |
peRecordType |
提供 ClfsDataRecord 的值。 |
plsnUndoNext |
接收数据记录的撤消下一个 LSN 字段。 无需此值即可继续读取链,因此可以忽略它。 |
plsnPrevious |
接收数据记录的 previous-LSN 字段。 无需此值即可继续读取链,因此可以忽略它。 |
plsnRecord |
接收已读取的数据记录的 LSN。 |
读取由以前的 LSN 链接的数据记录链
将数据记录写入 CLFS 流时,可以将数据记录的先前 LSN 设置为之前写入流的任何记录的 LSN。 通过设置以前的 LSN,可以创建一个相关记录链,以后可按相反顺序遍历这些记录。 例如,假设你正在执行数据库事务,并且必须编写多个 CLFS 日志记录来描述该事务进行的更新。 每次写入描述事务更新的日志记录时,可以将记录的上一个 LSN 设置为描述同一事务进行的更新的上一日志记录的 LSN。
假设你已编写一系列数据记录,这些记录由以前的 LSN 链接。 若要读取记录链,必须创建其模式设置为 ClfsContextPrevious 的读取上下文。 若要创建读取上下文并读取链中的第一条记录,请调用 ClfsReadLogRecord ,如下表所示。
参数名称 | 值 |
---|---|
pvMarshalContext |
提供指向封送区域的指针。 |
plsnFirst |
提供链中第一条记录的 LSN。 这必须是数据记录的 LSN,而不是重启记录。 |
peContextMode |
提供 ClfsContextPrevious 的值。 |
ppvReadBuffer |
接收记录数据。 |
2016 年 12 月 1 日 |
接收记录数据的大小。 |
peRecordType |
接收记录类型。 此值是一组指示记录的各种功能的标志。 记录是一条数据记录,因此收到的值应设置 ClfsDataRecord 标志,并清除 ClfsRestartRecord 标志。 |
plsnUndoNext |
接收数据记录的撤消下一个 LSN。 无需此值即可继续读取链,因此可以忽略它。 |
plsnPrevious |
接收数据记录的上一个 LSN。 无需此值即可继续读取链,因此可以忽略它。 |
ppvReadContext |
接收指向不透明读取上下文的指针。 使用读取上下文读取链中的上一条记录。 |
拥有读取上下文和第一条记录后,可以通过重复调用 ClfsReadNextLogRecord 来读取链中的剩余记录。 下表显示了如何设置和解释参数。
参数名称 | 值 |
---|---|
pvReadContext |
提供指向从 ClfsReadLogRecord 收到的读取上下文的指针。 |
ppvBuffer |
接收记录数据。 |
2013 |
接收记录数据的大小。 |
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 链接。 若要读取记录链,必须创建其模式设置为 ClfsContextPrevious 或 ClfsContextUndoNext 的读取上下文。 创建读取上下文,并通过调用 ClfsReadLogRecord 获取链中最近写入的记录。 然后重复调用 ClfsReadNextLogRecord 以获取链中以前的记录。 每次调用 ClfsReadNextLogRecord 时,请将 plsnUser 参数设置为链中上一条记录的 LSN。 在 plsnUser 中提供的 LSN 将覆盖存储在当前记录的 previous-LSN 或 undo-next LSN 字段中的任何值。
请注意,只有在调用 ClfsReadNextLogRecord 来读取记录链时,才能在流中向后移动。 在 plsnUser 中提供的 LSN 必须小于链中当前记录的 LSN。