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


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

В потоке общей файловой системы журналов (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

Получите поле 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 текущей записи в цепочке.