Синхронизируется ли типичная СУБД ACID с диском каждый коммит? - PullRequest
1 голос
/ 26 октября 2011

Буква «D» в ACID означает «Долговечность», которая определяется Википедией как: «каждая совершенная транзакция защищена от потери питания / сбоя / ошибок и не может быть потеряна системой и, таким образом, может быть гарантированно завершена».

Однако это будет означать, что каждая транзакция должна быть синхронизирована с диском перед тем, как будет объявлена ​​успешной, а не просто сброшена. ('flush' = отправлено на уровень операционной системы, 'sync' = отправлено на диск физического диска). Это сделало бы невозможным внедрение СУБД с высокой скоростью транзакций.

Действительно ли популярные СУБД синхронизируют каждую транзакцию?

Ответы [ 3 ]

3 голосов
/ 27 октября 2011

Базы данных, которые используют диск для постоянного хранения, действительно должны записывать на диск, чтобы сделать транзакцию долговременной.Кроме того, они также должны синхронизироваться с диском, чтобы избежать потерь из кэша обратной записи.

Для достижения высокой производительности базы данных будут использовать групповые фиксации, в результате чего несколько транзакций в цикле фиксации будут использовать одну и ту же операцию записи / синхронизации, чтобы сделать все транзакции долговечными.Это возможно, когда все они добавляются в один и тот же журнал транзакций.

Это может означать, что ответ отдельной фиксации может быть отложен (при ожидании присоединения других к циклу фиксации), но общая пропускная способность намного выше по всей базе данных, потому что стоимость записи / синхронизацииамортизируется через несколько транзакций.Например, каждая отдельная транзакция может занять 10 мс, но тысячи транзакций могут быть зафиксированы в одном цикле.

Для базы данных является нормальным измерять, сколько транзакций активно, чтобы определить, стоит ли заставлять какую-либо одну транзакцию ждать, пока другие присоединятся к циклу фиксации, так что в очень слегка загруженной системе транзакция не требуется.ждите других.

Не все базы данных используют диск, чтобы гарантировать долговечность.Например, VoltDB полагается на копии транзакции, хранящейся в памяти на нескольких серверах.Если один из серверов умирает, транзакция все еще доступна в другом месте.Следовательно, транзакция должна только гарантировать, что транзакция будет передана достаточному количеству серверов для обеспечения долговечности.

Это также поднимает вопрос о том, что является долговечным?Надежен ли один диск?Нет, если диск выходит из строя.Является ли массив RAID долговечным?Нет, если есть катастрофическое повреждение RAID.Единственная гарантия долговечности - это когда транзакции реплицируются в нескольких удаленных экземплярах базы данных, но не всем нужен такой уровень гарантии.Долговечность следует рассматривать не как бинарный вариант, а как выбор уровня долговечности.

1 голос
/ 26 октября 2011

«Диск» - это больше, чем один файл.При фиксации запись в журнал транзакций будет использоваться для обновления базы данных.Если система завершает работу до обновления, транзакции могут быть восстановлены из журнала.

0 голосов
/ 26 октября 2011

Да - это называется журнал отката.

Почему вы думаете, что это невозможно?

И, если вы говорите, что синхронизация каждой транзакции не происходит, что вы предлагаете в качестве решения проблемы?

...