Здравствуйте, Ночной Смотрящий, Вы писали:
S>>В частности, от идеи работать с memory-mapped file, похоже, придётся отказаться. Потому, что write-ahead log для него потребует flush на каждое изменение, вместо одного flush на коммит. НС>Так а зачем лог и данные в одном файле держать? Сиквел держит в разных, и для лога MMF в одно место не уперся, там все операции последовательные. А для файла страниц MMF — то что дохтур прописал.
Даже если держим в разных, WAL требует, чтобы страницы лога были записаныдо того, как на диск уедут изменённые страницы данных.
В MMF мы не можем этого гарантировать.
Поэтому возможна такая ситуация:
1. мы хотим внести изменение x = x + 1.
2. Мы добавляем к логу запись (@x, oldX, newX); (без flush)
3. Вносим изменение x = x + 1 в станицу данных;
4. Внезапно ОС решает, что пора скинуть страницу данных на диск
5. Происходит сбой (до коммита транзакции).
Всё — у нас на диске есть новое значение x, но нет лог-записей для того, чтобы откатить x обратно.
Чтобы предотвратить это, мы будем вынуждены делать flush лога между 2 и 3.
Альтернатива — иметь свой менеджер буферов, который в момент вытеснения буфера на диск делает flushLog(minLSN), гарантируя фиксацию нужной нам части лога.
Насколько я знаю, MS SQL идёт именно по этому пути.
Уйдемте отсюда, Румата! У вас слишком богатые погреба.