Может ли база данных поддерживать «атомарность», но не «согласованность» или наоборот? - PullRequest
14 голосов
/ 29 сентября 2010

Я читаю о свойствах ACID базы данных. Атомность и последовательность кажутся очень тесно связанными. Мне интересно, есть ли сценарии, в которых нам нужно просто поддерживать атомарность, а не согласованность или наоборот. Пример действительно поможет!

Ответы [ 5 ]

18 голосов
/ 29 сентября 2010

Они в некоторой степени связаны, но есть небольшая разница.

Атомарность означает, что ваша транзакция или происходит, или не происходит.

Согласованность означает, что такие вещи, как ссылочныецелостность обеспечивается.

Допустим, вы начинаете транзакцию, чтобы добавить две строки (кредит и дебет, который формирует одну банковскую транзакцию).Атомность этого не имеет ничего общего с согласованностью базы данных.Все это означает, что будут добавлены либо обе строки, либо ни одна строка.

На фронте согласованности, допустим, у вас есть ограничение внешнего ключа от orders до products.Если вы попытаетесь добавить заказ, относящийся к несуществующему продукту, это , когда сработает согласованность, чтобы помешать вам это сделать.отсюда их сходство.Первый пример будет гарантировать, что банк не потеряет деньги (или украдет их у вас), а второй будет гарантировать, что ваше приложение не будет удивлено заказами на продукты, о которых вы ничего не знаете.

7 голосов
/ 29 сентября 2010

Атомарность:

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

Консистенция:

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

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

И наоборот, база данных, которая поддерживает согласованность, но не атомарность, позволяет завершать частичные транзакции, если эффекты этой транзакции не нарушают каких-либо проверок целостности (например, внешние ключи должны совпадать с существующим идентификатором). Например, вы можете попробовать добавить новую строку, содержащую значения string и int, и даже если вставка не удалась на полпути из-за потери половины данных, строка будет разрешена при условии, что ни одна из потерянных данных не относится к обязательным столбцам и не содержит данных был вставлен в неправильно введенный столбец.

Сказав это, согласованность полагается на атомарность для обращения несовместимых транзакций.

0 голосов
/ 26 декабря 2016

Между атомарностью и последовательностью действительно существует тесная связь, но они не одинаковы:

  1. СУБД может (теоретически) поддерживать согласованность, а не атомарность: например, рассмотрим транзакцию, которая состоит из операций SQL O1, O2 и O3. Теперь предположим, что после O1 и O2 БД уже находится в согласованном состоянии. Затем СУБД может остановить транзакцию после O1 и O2 без O3 и при этом сохранить согласованность. Очевидно, что такая СУБД не поддерживает атомарность (поскольку O3 не был выполнен O1, а O2 был).

  2. СУБД может (теоретически) поддерживать атомарность, а не согласованность: это может происходить в многопользовательском сценарии, где атомарность гарантирует только то, что все действия транзакции будут выполнены (или ни одно из них), но это так. не гарантирует, что действия одной транзакции, выполненной одновременно с другой транзакцией, не могут оказаться в несогласованном состоянии.

Однако я верю (но не доказал формально), что если ваша DMBS гарантирует как атомарность, так и изоляцию, то она также должна гарантировать согласованность.

0 голосов
/ 30 марта 2016

Я также запутался, читая об атомарности и последовательности.Допустим, есть сценарий для пакетной вставки 1000 записей в таблицу счетов.

Атомность пакета - это если все 1000 записей вставлены или ни одна из записей не вставлена, если естьявляется ошибкой.

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

Надеемся, что этот пример устраняет путаницу.

0 голосов
/ 29 сентября 2010

У меня другое понимание согласованности в контексте ACID:

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

На мой взгляд, это равносильно сериализуемости.

...