Я много изучал, как достигается долговечность в базах данных, и если я хорошо понимаю, это работает так (упрощенно):
Точка зрения Клента:
- начать транзакцию.
- вставить в таблицу значения ...
- совершить транзакцию
Точка зрения двигателя БД:
- записать индикатор начала транзакции в файл журнала
- записать изменения, сделанные клиентом, в файл журнала
- записать индикатор фиксации транзакции в файл журнала
- сброс файла журнала на жесткий диск (это обеспечивает долговечность данных)
- вернуть 'OK' клиенту
Что я заметил:
Клиентское приложение является однопоточным приложением (одно соединение с БД). Я могу выполнить 400 транзакций в секунду, в то время как простые тесты, которые записывают что-то в файл и затем синхронизируют этот файл с жестким диском, выполняют только 150 синхронизаций в секунду. Если бы клиент был многопоточным / многопоточным соединением, я бы предположил, что механизм БД группирует транзакции и выполняет один fsync на несколько транзакций, но это не так.
Мой вопрос заключается в том, действительно ли, например, MsSQL, действительно синхронизирует файл журнала (fsync, FlushFileBuffers и т. Д.) При каждой фиксации транзакции, или это какая-то другая магия позади?