Номера последовательности журналов CLFS

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

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

ClfsLsnNull

ClfsLsnEqual

ClfsLsnGreater

ClfsLsnLess

Константы CLFS_LSN_NULL и CLFS_LSN_INVALID являются нижними и верхними границами для всех допустимых LSN. Любое допустимое LSN больше или равно CLFS_LSN_NULL. Кроме того, любое допустимое LSN строго меньше CLFS_LSN_INVALID. CLFS_LSN_NULL является допустимым LSN, в то время как CLFS_LSN_INVALID не является допустимым LSN. Даже поэтому можно сравнить CLFS_LSN_INVALID с другими LSN с помощью функций в предыдущем списке.

Для каждого потока CLFS отслеживает два специальных LSN: базовый LSN и последний LSN. Кроме того, каждая отдельная запись журнала имеет два специальных LSN (предыдущий LSN и отмена следующего LSN), которые можно использовать для создания цепочек связанных записей журналов. В следующих разделах подробно описаны эти специальные LSN.

Базовый номер LSN

Когда клиент записывает первую запись в потоке, CLFS устанавливает базовый LSN на LSN этой первой записи. Базовая LSN остается неизменной до тех пор, пока клиент не изменит ее. Если клиенты потока больше не нуждаются в записях до определенной точки в потоке, они могут обновить базовый LSN, вызвав ClfsAdvanceLogBase или ClfsWriteRestartArea. Например, если клиенты больше не нуждаются в первых пяти записях журнала, они могут задать базовый номер LSN шестой записи.

Последний номер LSN

Когда клиенты записывают записи в поток, CLFS настраивает последний LSN так, чтобы он всегда соответствовал последней записи. Если клиенты больше не нуждаются в записях после определенной точки в потоке, они могут обновить последний LSN, вызвав ClfsSetEndOfLog. Например, если клиенты больше не нуждаются в записях, написанных после десятой записи, они могут усечь поток, установив последний LSN в LSN десятой записи.

Активная часть потока

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

схема, иллюстрирующая активную часть потока clfs.

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

Предыдущий номер LSN

Предположим, что две активные транзакции базы данных (транзакция A и транзакция B) записывают записи в один поток одновременно. Каждый раз, когда транзакция A записывает запись, она устанавливает предыдущий номер LSN записи в LSN предыдущей записи журнала, записанной транзакцией A. Это формирует цепочку записей журнала, принадлежащих транзакции A, которая может проходить по обратному порядку. Цепочка заканчивается первой записью журнала, созданной транзакцией A, у которой предыдущий LSN установлен в CLFS_LSN_INVALID. Аналогичным образом транзакция B создает собственную цепочку записей журналов, задав предыдущую LSN каждой записи журнала, которую она записывает.

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

схема, иллюстрирующая предыдущие указатели lsn.

Отмена следующего LSN

Предположим, что транзакция делает пять обновлений объекта данных в переменной памяти, откатывает четвертые и пятые обновления, а затем делает шестое обновление. По мере того как транзакция выполняет обновления, она записывает записи журнала 1, 2, 3, 4, 5, 5, 4 и 6. Записи журнала 1–5 описывают изменения, внесенные обновлениями 1–5. Запись 5' описывает изменения, внесенные во время отката обновления 5, и запись 4 описывает изменения, внесенные во время отката обновления 4. Наконец, запись 6 описывает изменения, внесенные обновлением 6. Номера 1, 2, 3, 4, 5, 5', 4 и 6 не являются LSN записей журнала; Они просто цифры, используемые для имени записей журнала для этого обсуждения.

Записи журнала 5'и 4', описывающие откаты, называются записями журнала компенсации (CLR). Транзакция устанавливает значение для undo-next LSN каждого CLR на предшествующую (среди записей, записанных транзакцией) запись журнала, обновление которой было откатано. В этом примере undo-next LSN записи 5' является LSN записи 4, а undo-next LSN записи 4' — LSN записи 3.

Обычные записи журналов (которые не являются CLR), имеют их незавершивающиеся LSN, заданные предыдущей записью журнала, написанной транзакцией. То есть для обычной записи отмена следующего LSN и предыдущего LSN совпадают.

Теперь предположим, что произошел системный сбой, и в процессе восстановления после перезагрузки требуется откат всей транзакции. Код восстановления считывает запись журнала 6. Данные в записи 6 указывают на то, что запись 6 является обычной (не CLR), поэтому код восстановления возвращает состояние до обновления 6. Затем код восстановления проверяет следующий LSN записи 6 и находит, что он указывает на запись 4. Данные в записи 4' указывают на то, что это CLR, поэтому код восстановления не откатывает обновление 4'. Вместо этого он проверяет отмену следующего LSN записи 4' и находит, что указывает на запись 3. Запись 3 не является CLR, поэтому код восстановления отменяет обновление 3. Обновления 5 и 4 не отменяются во время процесса восстановления системных данных, так как они уже были отменены в ходе стандартной прямой обработки. Наконец, код восстановления откатывает обновления 2 и 1.

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

схема, демонстрирующая предыдущие lsn и отмена следующего указателя lsn.

См. также

ClfsLsnNull

ClfsLsnEqual

ClfsLsnGreater

ClfsLsnLess

ClfsAdvanceLogBase

ClfsWriteRestartArea

ClfsSetEndOfLog

Поддержка CLFS для архивации