Синхронизируется ли типичная СУБД ACID с диском каждый коммит?
Буква "D" в ACID означает "Долговечность", которая определяется Википедией как: "каждая подтвержденная транзакция защищена от потери питания / сбоя / ошибок и не может быть потеряна системой и, таким образом, может быть гарантированно завершена".
Однако это будет означать, что каждая транзакция должна быть синхронизирована с диском до того, как будет объявлена успешной, а не просто сброшена. ('flush'= отправлено на уровень операционной системы, 'sync'= отправлено на диск физического диска). Это сделало бы невозможным внедрение СУБД с высокой скоростью транзакций.
Действительно ли популярные РСУБД синхронизируют каждую транзакцию?
3 ответа
Базы данных, которые используют диск для постоянного хранения, действительно должны записывать на диск, чтобы сделать транзакцию долговременной. Кроме того, они также должны синхронизироваться с диском, чтобы избежать потерь из кэша обратной записи.
Для достижения высокой производительности базы данных будут использовать групповые фиксации, в результате чего несколько транзакций в цикле фиксации будут использовать одну и ту же операцию записи / синхронизации, чтобы сделать все транзакции долговечными. Это возможно, когда все они добавляются в один и тот же журнал транзакций.
Это может означать, что ответ отдельной фиксации может быть отложен (в ожидании присоединения других к циклу фиксации), но общая пропускная способность намного выше по всей базе данных, потому что стоимость записи / синхронизации амортизируется по нескольким транзакциям. Например, каждая отдельная транзакция может занять 10 мс, но тысячи транзакций могут быть зафиксированы в одном цикле.
Для базы данных является нормальным измерять, сколько транзакций активно, чтобы определить, стоит ли заставлять какую-либо одну транзакцию ждать, пока другие присоединятся к циклу фиксации, так что в очень слегка загруженной системе транзакция не должна ждать других.
Не все базы данных используют диск, чтобы гарантировать долговечность. Например, VoltDB полагается на копии транзакции, хранящейся в памяти на нескольких серверах. Если один из серверов умирает, транзакция все еще доступна в другом месте. Следовательно, транзакция должна только гарантировать, что транзакция была передана достаточному количеству серверов для обеспечения надежности.
Это также поднимает вопрос о том, что является долговечным? Надежен ли один диск? Нет, если диск выходит из строя. Является ли массив RAID долговечным? Нет, если есть катастрофическое повреждение RAID. Единственная гарантия долговечности заключается в том, что транзакции реплицируются в нескольких удаленных экземплярах базы данных, но не всем нужен такой уровень гарантии. Долговечность следует рассматривать не как бинарный вариант, а как выбор уровня долговечности.
"Диск" - это больше, чем один файл. Коммит будет записывать в журнал транзакций, который затем будет использоваться для обновления базы данных. Если перед обновлением происходит сбой системы, транзакции могут быть восстановлены из журнала.
Да, это называется журнал отката.
Почему вы думаете, что это невозможно?
И, если вы говорите, что синхронизация каждой транзакции не происходит, что вы предлагаете в качестве решения проблемы?