Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
В потоке common Log File System (CLFS) есть два типа записей: записи данных и записи перезапуска. В этой статье объясняется, как считывать последовательность записей данных из потока. Сведения о том, как считывать записи перезапуска, см. в разделе "Чтение записей перезапуска" из потока CLFS.
Существует несколько вариантов чтения последовательности записей данных из потока. Вы можете считывать в потоке данные из указанной записи или считывать обратно по цепочке связанных записей.
Для всех вариантов чтения последовательности записей данных выполните следующие действия.
Вызовите ClfsReadLogRecord , чтобы получить контекст чтения и первую запись данных в последовательности.
Передавайте контекст чтения, полученный на шаге 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 текущей записи в цепочке.