Чтение записей данных из потока CLFS

В потоке common Log File System (CLFS) есть два типа записей: записи данных и записи перезапуска. В этой статье объясняется, как считывать последовательность записей данных из потока. Сведения о том, как считывать записи перезапуска, см. в разделе "Чтение записей перезапуска" из потока CLFS.

Существует несколько вариантов чтения последовательности записей данных из потока. Вы можете считывать в потоке данные из указанной записи или считывать обратно по цепочке связанных записей.

Для всех вариантов чтения последовательности записей данных выполните следующие действия.

  1. Вызовите ClfsReadLogRecord , чтобы получить контекст чтения и первую запись данных в последовательности.

  2. Передавайте контекст чтения, полученный на шаге 1, в ClfsReadNextLogRecord повторно, чтобы получить оставшиеся записи данных в последовательности.

Caution

Контексты чтения не являются потокобезопасными. Клиенты отвечают за сериализацию доступа к контекстам чтения.

В следующих подтопиках рассматриваются сведения о чтении различных типов последовательностей записей и цепей.

Чтение из указанной записи данных

Чтобы читать потоком CLFS (начиная с выбранной вами записи данных), необходимо создать контекст чтения с режимом ClfsContextForward. Чтобы создать контекст чтения и прочитать первую запись (в наборе, который вы выбрали для чтения), вызовите ClfsReadLogRecord , как показано в следующей таблице.

Имя параметра Ценность
pvMarshalContext Укажите указатель на область маршаллинга.
plsnFirst Укажите LSN первой записи, которую вы хотите прочитать. Это должен быть номер LSN записи данных, а не запись перезапуска.
peContextMode Укажите значение ClfsContextForward.
ppvReadBuffer Получите данные вашей записи.
pcbReadBuffer Узнайте размер данных вашей записи.
peRecordType Получите тип записи. Это значение представляет собой набор флагов, указывающих на различные характеристики записи. Запись — это запись данных, поэтому значение, которое вы получаете, должно иметь установлен флаг ClfsDataRecord и флаг ClfsRestartRecord должен быть очищен.
plsnUndoNext Получите 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.

Чтение последовательности записей данных, связанных с undo-next LSN

При записи данных в поток CLFS вы можете установить для отмены следующий LSN записи на LSN любой записи, которую вы ранее сделали в потоке. Задав отмену следующего LSN, можно создать цепочку связанных записей, которые можно пройти в обратном порядке. Дополнительные сведения о создании и интерпретации цепочек отмены/восстановления см. в разделе CLFS Log Sequence Numbers.

Предположим, вы написали цепочку записей данных, связанных с их "undo-next" LSN. Чтобы прочитать цепочку записей, необходимо вызвать ClfsReadLogRecord для создания контекста чтения с установленным режимом ClfsContextUndoNext. После этого процесс идентичен чтению цепочки, связанной предыдущими LSN (описанными ранее в этой статье).

Чтение цепочки записей данных, связанных с пользователем LSN

Помимо цепочек, связанных с предыдущими LSN и отменой следующих LSN, можно создавать цепочки, связанные собственными LSN, которые вы внедряете в данные записи.

Предположим, вы написали цепочку записей данных, связанных с LSN, которые хранятся в самих данных записи. Чтобы прочитать цепочку записей, необходимо создать контекст чтения, который имеет его режим, равный ClfsContextPrevious или ClfsContextUndoNext. Создайте контекст чтения и получите последнюю запись в цепочке, вызвав ClfsReadLogRecord. Затем повторно вызовите ClfsReadNextLogRecord , чтобы получить предыдущие записи в цепочке. При каждом вызове ClfsReadNextLogRecord задайте для параметра plsnUser значение LSN предыдущей записи в цепочке. LSN, который вы предоставляете в plsnUser, переопределяет любые значения, хранящиеся в полях предыдущего LSN или поля отмены следующего LSN текущей записи.

При вызове ClfsReadNextLogRecord для чтения цепочки записей можно перемещаться только назад в потоке. Номер LSN, который вы предоставляете в plsnUser, должен быть меньше LSN текущей записи в цепочке.

См. также

архивный хвост

Номера последовательности журналов CLFS

ClfsReadLogRecord

ClfsReadNextLogRecord

Чтение записей перезапуска из потока CLFS