Поделиться через


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

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

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

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

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

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

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

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

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

Чтобы выполнить чтение в потоке CLSF (начиная с выбранной записи данных), необходимо создать контекст чтения, который имеет режим 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 следующей операции отмены для записи данных. Это значение не требуется для продолжения чтения цепочки, поэтому его можно игнорировать.

plsnПредыдущий

Получите предыдущее поле 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 отмены следующего номера 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.

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

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

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

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

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