Реализация транзакции для простого файла - PullRequest
1 голос
/ 18 марта 2009

Я являюсь частью команды, пишущей приложение для встроенных систем. Приложение часто страдает от повреждения данных, вызванного нехваткой электроэнергии. Я думал, что реализация каких-то транзакций остановит это. Один сценарий может включать копирование области файла перед записью в какое-либо дополнительное хранилище (журнал транзакций). Каковы другие возможности?

Ответы [ 3 ]

5 голосов
/ 19 марта 2009

Базы данных используют различные методы, чтобы гарантировать правильное сохранение состояния.

  1. СУБД часто сохраняет реплицированный управляющий файл - несколько синхронизированных копий на нескольких устройствах. Два достаточно. Больше, если ты параноик. Контрольный файл содержит несколько ключевых параметров, используемых для поиска других файлов и их ожидаемых состояний. Управляющий файл может содержать «номер версии базы данных».

  2. Каждый файл имеет «номер версии» в нескольких формах. Часто это в простой форме плюс в некотором XOR-дополнении, так что два номера версий могут быть тривиально проверены, чтобы иметь правильное отношение, и соответствовать номеру версии контрольного файла.

  3. Все транзакции записываются в журнал транзакций. Затем журнал транзакций записывается в файлы базы данных.

  4. Перед записью в файлы базы данных исходный блок данных копируется в «журнал до изображения», или в сегмент отката, или в какой-то подобный файл.

  5. Когда блок записывается в файл, порядковые номера обновляются, и блок удаляется из журнала транзакций.

Вы можете прочитать о методах RDBMS для надежности.

2 голосов
/ 23 марта 2009

Есть несколько способов сделать это; как правило, требуется только одно предположение, что небольшие записи (<4k) являются атомарными. Например, вот как CouchDB делает это: </p>

  • Заголовок 4k содержит, помимо прочего, смещение файла корня BTree, содержащего все данные.
  • Файл только для добавления. Когда требуются обновления, запишите обновление в конец файла, за которым следуют любые модифицированные узлы BTree, вплоть до корневого. Затем очистите данные и запишите новый адрес корневого узла в заголовок.

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

Когда файл увеличивается слишком долго, просто считайте все «живые» данные и запишите их в новый файл, а затем удалите оригинал.

0 голосов
/ 11 февраля 2012

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

Старая ссылка больше недоступна, репозиторий github - здесь .

...