Получить доступ

На каком уровне документная база вроде MongoDB даёт атомарность по умолчанию?

MiddleДокументные БДMongoDB
Ещё спрашивают так:
  • Есть ли транзакции в MongoDB?
Коротко

По умолчанию атомарна операция над одним документом, включая вложенные массивы и поля. Всё, что должно меняться вместе, стараются положить в один документ.

  • Многодокументные транзакции есть с MongoDB 4.0 (реплика-сет) и 4.2 (шарды), но дороже
  • Атомарные операторы: $inc, $push, findOneAndUpdate
  • Модель данных подбирают так, чтобы транзакции между документами были редки

А ещё Ограничения транзакций: время жизни, размер, нагрузка на кластер

Так подсказку видит пользователь sotto на живом собеседовании — за пару секунд, пока вы думаете вслух.

Подробно

Из этого правила напрямую вытекает подход к моделированию: связанные данные, изменяемые одной операцией, вкладывают в документ, а не разносят по коллекциям — тогда транзакции просто не нужны. Многодокументные транзакции появились в поздних версиях и работают, но стоят дороже и в распределённой конфигурации накладывают ограничения, поэтому опираться на них как на основной приём проектирования не стоит. Полезно провести параллель с DDD: документ хорошо соответствует агрегату, и правило «одна транзакция меняет один агрегат» здесь становится техническим ограничением, а не рекомендацией.

Что хотят услышать

  • Атомарность на уровне документа.
  • Многодокументные транзакции и их цена.
  • Влияние на моделирование.

Частые ошибки

  • Переносить реляционную схему в документную базу как есть и компенсировать транзакциями.
  • Считать многодокументные транзакции бесплатными.

Проверьте себя

Один верный вариант. Подумайте, потом откройте ответ.

Показать варианты и ответ
  • ✓На уровне одного документа: обновление документа целиком атомарно, а операции над несколькими документами требуют явных транзакций
  • ✗На уровне коллекции — все операции в одной коллекции атомарны
  • ✗Атомарности нет ни на каком уровне
  • ✗На уровне всей базы данных

Что спросят дальше

  • Как это соотносится с понятием агрегата в DDD?
  • Когда всё же приходится разносить данные по коллекциям?

Разбор темы

Связанные вопросы

Закрытая бета

Подсказки на собеседовании — в реальном времени

sotto слышит вопрос интервьюера и показывает короткий ответ и план, как в блоке «Коротко». Оставьте контакт — пришлём доступ и промокод.

  • Промокод на 2 часа — сверх пробных 30 минут
  • Программа для Windows — скачать сразу, войти — через Яндекс ID или VK ID
  • Прямая связь с разработчиком: что улучшить — сделаем