Примечание
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
В потоке common Log File System (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 |
Получить поле 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 текущей записи в цепочке.