> На CoW получить старое состояние файла в случае "не прокатило" вопрос что такое старое состояние в случае
begin; set sum=sum-b where id='c'; set sum=sum+b where id='d'; commit; выполнившегося примерно на 2/3. И не останешься ли ты при этом без денег, при том что d их так и не получил.
fs при этом консистентна, предположим. Файл читается (то есть внутри не появилась пачка нулей просто так, потому что блок распределили а записать его не успели - это вот то от чего гарантирует CoW и не помогает журнал только метаданных). Просто вторая операция недовыполнилась и CoW остановилась на полдороге.
> Если журналить данные - можно либо завершить ту запись,
fs ничего не знает о "той" или "не той".
Вот сколько в том примере выше записей? Без знания структуры файла и насколько далеко в нем лежат нужные куски? Правильный ответ - а хз! fs можно что-то подсказать только сделав fsync - но это медленно.
> Есть только 1 нюанс: писать данные сперва в журнал, потом в основную область означает ДВЕ
> записи данных.
да. Причем первая запись еще и синхронная, с ожиданием подтверждения. И любая обеспечивающая транзакционную целостность субд - так и делает. double write, fsync. CoW в ней при этом может и не быть, данные могут заменяться in-place, индексы могут при крэше портиться и требовать хитрых процедур восстановления, но вот лог транзакции сохраняется целиком и она не подтвердится пока не будет сохранена.
А для fs это просто lseek/write/lseek/write - и она не знает, это одна транзакция или две разные.
Или половина одной, и сейчас еще два таких приедут. Вообще в другой файл, потому что у нас sharding ;-)
> Думаю что они не полностью корректно смогли изобразить файлухой журнал.
там идея что оно при нормальной эксплуатации глючит. Без крэшей - просто данные портятся. А хз почему. Вероятнее всего проблема где-то в mysql, этот режим работы просто никто не тестирует.
Поэтому идея sqlite с rename (который почти всегда атомарный) на самом деле не так уж ужасно плоха, пока записей не слишком много. Гарантированно работает в любой системе вплоть до msdos.