Это - один из тех, "Я знаю, что не должен делать этого, но это, о, настолько удобно". вопросы. Извините за это.
Я планирую использовать CouchDB для хранения набора документов и хранения их всей истории пересмотра. CouchDB делает управление версиями автоматически, но ему сильно препятствуют для использования программиста:
"Вы не можете полагаться на изменения документа ни для какой другой цели, чем управление совместным выполнением".
Из того, что я нашел на CouchDB wiki, версии могут быть удалены или во время уплотнения или во время репликации. Насколько я могу сказать, Уплотнение должно всегда быть инициировано вручную, и Репликация происходит только, когда существует больше чем один сервер базы данных.
Вопрос: если я не выполню уплотнение и буду использовать только экземпляр единой базы данных для моих документов, я могу просто использовать управление версиями документа CouchDB и ожидать, что это будет работать?
С чем другими проблемами я мог бы столкнуться? Например, разве рабочее уплотнение не повреждает производительность или использует значительно больше дискового пространства (чем если бы я действительно обрабатывал управление версиями вручную)?
Если вы немного переформулируете предложение, в нем говорится: «Любое обновление, независимо от того, насколько оно незначительное, может полностью изменить поведение. Мы гарантируем, что вы можете использовать его для параллелизма, но ни для чего другого».
Поэтому я бы не стал на него полагаться, потому что в нашем промышленность, подобные вещи будут преследовать вас через 6 месяцев, если только вы не можете абсолютно гарантировать, что никогда, никогда не обновите CouchDB.
Если это неправильно, то я не хочу быть правым!
Собственно, нет. Это не правильно. Майкл хорошо объяснил это: в лучшем случае это делает ваше приложение очень ненадежным, а в худшем случае вы получите серьезные ошибки, которые заставят вас перестроить архитектуру в неудобное время.
Рассмотрим Google App Engine. Каков их предлагаемый шаблон транзакции?
Они образуют функцию, которая повторно запускается, если транзакция не удалась. Почему? И почему выборка должна выполняться внутри транзакции, а не зависать во внешней области?
Поскольку App Engine использует MVCC внутри себя. Если вы столкнулись с конфликтом (ваша версия неверна, потому что кто-то обновил ее), они просто повторно запустят вашу функцию. Следующая итерация получит более новую ревизию, обновит новые данные и снова установит правильную ревизию. Дело в том, что Google не раскрывает это пользователям, потому что это не подходящая среда для создания управления версиями на уровне приложений.