Хранение журнала отката (undo)
Эта страница переведена при помощи нейросети GigaChat.
OrioleDB может хранить журнал отката (undo) в файлах, но также обеспечивает буферизацию в оперативной памяти. Буферизация предназначена для обеспечения наиболее быстрого доступа к самым последним записям отката. Общий размер буферов отката контролируется параметром GUC orioledb.undo_buffers. Данный размер разделяется на две половины: одна для кольцевого буфера, другая для блочных буферов.
OrioleDB сохраняет такое количество записей журнала отката, которое необходимо для выполнения следующих требований:
- откат любых транзакций в процессе выполнения;
- обслуживание любых существующих снимков;
- откат любых транзакций во время создания контрольной точки.
На рисунке ниже показан процесс заполнения кольцевого буфера отката. Позиция удержания (retain location) — минимальная позиция, до которой необходимо сохранять записи отката для выполнения требований. Стрелки между записями отката иллюстрируют порядок вставки, а не фактические ссылки.
После достижения конца кольцевого буфера заполнение продолжается с начала, если позиция удержания позволяет это сделать без перезаписи необходимых записей отката. При условии, что не требуется удерживать слишком большое количество записей отката, все они могут храниться в кольцевом буфере.
При необходимости добавить новую запись отката, когда соответствующее место в буфере занято удерживаемыми записями отката, часть записей записывается в файлы отката. На рисунке ниже показано разделение журнала отката между кольцевым буфером и файлом отката. Записи до позиции записи (written location) сохраняются в файлах отката, а записи после позиции записи остаются в кольцевом буфере. Если нет необходимости удерживать значительную часть журнала отката (например, завершена длительная транзакция), возможно вернуться к хранению всего журнала отката в кольцевом буфере.
Два следующих рисунка поясняют процесс записи группы записей отката в файл данных. Сначала устанавливается позиция «запись в процессе» (write in-progress). Это означает, что записи отката в диапазоне [позиция записи; позиция записи в процессе) подлежат записи в файлы отката. В этот период записи отката из данного диапазона могут считываться из кольцевого буфера, но не могут изменяться (в некоторых ситуациях требуется обновление существующих записей отката).
После завершения записи позиция записи сдвигается вперед, и весь диапазон отката становится доступен для чтения и записи.