Причина, по которой системы управления базами данных обычно используют только один файл журнала с записью или, альтернативно, пользовательскую файловую систему, заключается в том, что обычные файловые системы действительно плохо делают какие-либо гарантии об атомарности или порядке выполнения.
Они полностью оптимизированы для обеспечения согласованности и производительности.
Таким образом, можно доверять только порядку записи в один файл, если только вы не создаете файл раздела или изображения со специализированной файловой системой.
Вы можете, однако, записывать номера транзакций с каждой записью в несколько файлов.
И сделать очевидным, была ли запись полной, например. с блоками стиля xml или json с маркерами начала и конца, например < элемент > ... </элемент > или {...}, & c.
Затем ваш код может легко обнаружить любые пробелы в нескольких файлах и определить последнее согласованное состояние после сбоя.
Чтобы избежать последнего согласованного состояния после того, как авария закончилась сколь угодно старыми, потому что некоторая запись в кеше ожидала в течение нескольких минут, любой из этих подходов можно комбинировать с sync/fsync.
Использование sync/fsync также делает транзакционные транзакции возможными, то есть гарантируя, что все до сих пор было написано, по крайней мере, с точки зрения файловой системы.
Возможно, ваша система хранения может потерять последнюю запись из-за отключения электроэнергии, будь то жесткий диск или SSD с внутренним кешем, NAS, & c. Гарантии, предоставляемые этими системами, могут сильно различаться, что является проблемой для рассмотрения всеми подходами, независимо от того, используете ли вы файловую систему или традиционную СУБД для хранения.
Использование ИБП, безусловно, отличное дополнение, если вы пишете на встроенный жесткий диск или SSD, особенно если вы закрываете свою систему контролируемым образом, как только USP сигнализирует, что пришло время сделать это^^
does not file-locking (который реализуется почти каждой файловой системой) обеспечивает атомные операции? 'd = FileWriter.open (['file1', 'file2'], 'wb +')' Я думаю, что этот оператор поместит блокировку записи в этот файл. Единственное, что вы должны убедиться, что другой процесс проверяет статус блокировки файла. –
Я только что сделал FileWriter. Наивно он последовательно записывался в два файла. Если что-то перерывается между вами, вам не повезло. Представьте, что эти файлы представляют собой индекс поисковой системы. Поскольку вы только писали один файл, а не другой, у вас теперь есть поврежденный индекс. –
a ok, я пропустил бит. Вам нужна атомная операция над всеми файлами. –