Я не эксперт по базам данных и не имею официального опыта работы с информатикой, так что терпите меня. Я хочу знать , виды реальных негативных вещей , которые могут произойти , если вы используете старую версию MongoDB до v4 , которые не были ACID требований. Это относится к любой базе данных, несовместимой с ACID.
Я понимаю, что MongoDB может выполнять атомарные операции , но они не "поддерживают традиционную блокировку и сложные транзакции", в основном по соображениям производительности. Я также понимаю важность транзакций базы данных и пример, когда ваша база данных предназначена для банка, и вы обновляете несколько записей, которые все должны быть синхронизированы, вы хотите, чтобы транзакция вернулась в исходное состояние, если есть перебои в подаче электроэнергии, поэтому кредит равен покупке и т. д.
Но когда я вхожу в разговоры о MongoDB, те из нас, кто не знает технических деталей о том, как на самом деле реализованы базы данных, начинают разбрасываться такими заявлениями:
MongoDB работает намного быстрее, чем MySQL и Postgres, но есть небольшой шанс, например, 1 на миллион, что он «не сохранит правильно».
Эта часть «не сохранит правильно» относится к следующему пониманию: если в момент записи в MongoDB происходит сбой питания, есть шанс для конкретной записи (например, вы отслеживаете просмотры страниц в документах с 10 атрибутами). каждый), что один из документов сохранил только 5 атрибутов… что означает, что со временем ваши счетчики просмотров будут «слегка» выключены. Вы никогда не узнаете, насколько, вы знаете, что они будут правильными на 99,999%, но не на 100%. Это потому, что, если вы специально не сделали это атомарной операцией mongodb , эта операция не гарантированно была атомарной.
Поэтому мой вопрос: какова правильная интерпретация того, когда и почему MongoDB может «не сохранять правильно»? Каким частям ACID он не соответствует, и при каких обстоятельствах, и как вы узнаете, что эти 0,001% ваших данных отключены? Разве это не может быть исправлено как-то? Если нет, то это означает, что вы не должны хранить такие вещи, как ваша users
таблица, в MongoDB, потому что запись может не сохраниться. Но опять же, этому 1/1 000 000 пользователей может просто понадобиться «попробовать зарегистрироваться снова», нет?
Я просто ищу, может быть, список, когда / почему негативные вещи случаются с несовместимой с ACID базой данных, такой как MongoDB, и в идеале, если есть стандартный обходной путь (например, запустить фоновое задание для очистки данных или использовать только SQL для этого и т. Д.) ,
Это на самом деле не правильно, что MongoDB не совместим с ACID. Напротив, MongoDB является ACID-совместимым на уровне документа .
Любое обновление одного документа
В MongoDB нет транзакций, то есть обновлений нескольких документов, которые можно откатить и совместить с ACID.
Обратите внимание, что вы можете создавать транзакции поверх ACID-совместимых обновлений для одного документа, используя двухфазную фиксацию .
источник
Хорошее объяснение содержится в «Starbucks не использует двухфазную фиксацию» .
Речь идет не о базах данных NoSQL, но иллюстрирует тот факт, что иногда вы можете позволить себе потерять транзакцию или временно привести вашу базу данных в несогласованное состояние.
Я бы не подумал, что это нужно исправить. Исправление заключается в использовании ACID-совместимой реляционной базы данных. Вы выбираете альтернативу NoSQL, когда ее поведение соответствует требованиям вашего приложения.
источник
Я думаю, что другие люди уже дали хорошие ответы. Однако я хотел бы добавить, что есть ACID NOSQL DBs (например, http://ravendb.net/ ). Так что это не только решение NOSQL - ни ACID, ни реляционный с ACID ....
источник
«Не сохранить правильно» может означать:
По умолчанию MongoDB не сохраняет ваши изменения на диск сразу. Таким образом, существует вероятность, что вы сообщаете пользователю «обновление прошло успешно», происходит сбой питания и обновление теряется. MongoDB предоставляет опции для контроля уровня обновления «долговечность». Он может ждать, пока другие реплики получат это обновление (в памяти), дождаться, пока произойдет запись в файл локального журнала и т. Д.
Нет простых «атомарных» обновлений нескольких коллекций и даже нескольких документов в одной коллекции. В большинстве случаев это не проблема, поскольку ее можно обойти с помощью двухфазной фиксации или реструктуризации схемы, чтобы обновления выполнялись в одном документе. См. Этот вопрос: Базы данных документов: избыточные данные, ссылки и т. Д. (В частности, MongoDB)
источник
Начиная с MongoDB v4.0, транзакции ACID с несколькими документами должны поддерживаться. Благодаря изоляции моментальных снимков транзакции обеспечат глобально согласованное представление данных и обеспечат выполнение «все или ничего» для поддержания целостности данных.
Они чувствуют себя как транзакции из реляционного мира, например:
Смотрите https://www.mongodb.com/blog/post/multi-document-transactions-in-mongodb
источник
Пожалуйста, прочитайте о свойствах ACID, чтобы лучше понять.
Также в документации MongoDB вы можете найти вопрос и ответ .
A
только на уровне документов. Он не соответствует определению Atomic, которое мы знаем из систем реляционных баз данных, в частности, по ссылке выше. В этом смысле MongoDB не соответствует A из ACID.C
месте по умолчанию. Однако вы можете читать со вторичных серверов в наборе реплик. Вы можете иметь только возможную последовательность в этом случае. Это полезно, если вы не против прочитать немного устаревшие данные.I
солирование (опять же согласно приведенному выше определению):D
удобства использования - вы можете настроить это поведение с помощьюwrite concern
опции, хотя не уверен. Может кто знает лучше.Я полагаю, что продолжаются некоторые исследования для продвижения NoSQL к ограничениям ACID или аналогичным. Это сложная задача, поскольку базы данных NoSQL обычно бывают быстрыми (er), а ограничения ACID могут значительно снизить производительность.
источник
Единственная причина, по которой atomic изменяет работу с одной коллекцией, заключается в том, что разработчики mongodb недавно обменялись блокировкой базы данных с блокировкой записи всей коллекции. Решив, что увеличение параллелизма здесь стоило компромисса. По своей сути, mongodb - это отображенный в памяти файл: они делегировали управление пулом буферов подсистеме vm машины. Поскольку они всегда находятся в памяти, они могут избежать неприятных блокировок: вы будете выполнять операции только в памяти, удерживая их, что будет очень быстро. Это существенно отличается от традиционной системы баз данных, которая иногда вынуждена выполнять ввод-вывод, удерживая блокировку страницы или строку.
источник
«В MongoDB операция над одним документом является атомарной» - это дело прошлого
В новой версии MongoDB 4.0 вы МОЖЕТЕ:
Хотя есть несколько ограничений на то, как и какие операции можно выполнять.
Проверьте Монго Док. https://docs.mongodb.com/master/core/transactions/
источник
Вы можете реализовать атомарные многоключевые обновления (сериализуемые транзакции) на стороне клиента, если ваше хранилище поддерживает линеаризацию по ключам, сравнивает и устанавливает (что верно для MongoDB). Этот подход используется в Google Percolator и в CockroachDB, но ничто не мешает вам использовать его с MongoDB.
Я создал пошаговую визуализацию таких транзакций. Я надеюсь, что это поможет вам понять их.
Если вы согласны с уровнем изоляции для фиксации чтения, то имеет смысл взглянуть на транзакции RAMP Питера Бэйлиса. Они также могут быть реализованы для MongoDB на стороне клиента.
источник