Чтение записей данных из потока CLFS
В потоке общей файловой системы журналов (CLFS) существует два типа записей: записи данных и записи перезапуска. В этом разделе объясняется, как считывать последовательность записей данных из потока. Сведения о чтении записей перезапуска см. в статье Чтение записей перезапуска из потока CLFS.
Существует несколько вариантов чтения последовательности записей данных из потока. Вы можете считывать вперед в потоке из указанной записи или обратно по цепочке связанных записей.
Для всех вариантов чтения последовательности записей данных выполните следующие действия.
Вызовите ClfsReadLogRecord , чтобы получить контекст чтения и первую запись данных в последовательности.
Повторно передайте контекст чтения, полученный на шаге 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 |
Получите поле undo-next 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 undo-next, можно создать цепочку связанных записей, которые можно перемещать в обратном порядке. Дополнительные сведения о создании и интерпретации цепочки отмены следующего действия см. в разделе Порядковые номера журналов CLFS.
Предположим, вы написали цепочку записей данных, связанных с их отменой следующего номера LSN. Чтобы считывать цепочку записей, необходимо вызвать Метод ClfsReadLogRecord , чтобы создать контекст чтения, в режиме которого задано значение ClfsContextUndoNext. После этого процесс идентичен чтению цепочки, связанной с предыдущими номерами LSN (описано ранее в этом разделе).
Чтение цепочки записей данных, связанных с LSN пользователя
Помимо цепочек, связанных предыдущими номерами LSN и отменой следующего номера LSN, вы можете создавать цепочки, связанные с собственными номерами LSN, которые вы внедряете в данные записей.
Предположим, что вы записали цепочку записей данных, связанных с именами LSN, которые вы сохранили в самих данных записи. Чтобы считывать цепочку записей, необходимо создать контекст чтения, в режиме которого задано значение ClfsContextPrevious или ClfsContextUndoNext. Создайте контекст чтения и получите последнюю запись в цепочке, вызвав ClfsReadLogRecord. Затем повторно вызовите ClfsReadNextLogRecord , чтобы получить предыдущие записи в цепочке. При каждом вызове ClfsReadNextLogRecord присвойте параметру plsnUser значение LSN предыдущей записи в цепочке. Номер LSN, указанный в plsnUser, переопределяет все значения, хранящиеся в полях LSN previous-LSN текущей записи или отменить следующий номер LSN.
Обратите внимание, что вы можете перемещаться назад в потоке только при вызове ClfsReadNextLogRecord для чтения цепочки записей. Номер LSN, который вы указываете в plsnUser , должен быть меньше LSN текущей записи в цепочке.