CouchDB с одним узлом, транзакция с несколькими документами

Предполагая, что в проектном документе есть функция validate_doc_update, определенная как:

{
   "_id": "_design/ddoc",
   "_rev": "12-133b5dad579f872884a9ccd6d4be5ee9",
   "language": "javascript",
   "validate_doc_update": "function(newDoc, oldDoc, userCtx) {
        if (oldDoc._rev != newDoc._rev) { throw('FAILED') }
   }"
}

Если мы выполним массовое обновление (_bulk_docs); является ли он транснациональным для более чем одного документа?

Примечание. Я нашел этот ответ и прочитал документы и запустили некоторый тестовый код. И кажется, это идеальный способ выполнения транзакций на CouchDB! Но так как я не видел его в других местах (и интересно, почему?); хотел убедиться, что это не ошибка.


person Kaveh Shahbazian    schedule 26.12.2016    source источник


Ответы (2)


Разработчик CouchDB здесь.

Это не транзакционно, и так задумано даже на одном узле.

Причина в том, что мы не хотим иметь какие-либо API в CouchDB, которые ломаются при переходе от установки с одним узлом к ​​установке кластера.

В кластере намного сложнее гарантировать транзакцию с несколькими документами, поэтому CouchDB даже не пытается это сделать.

person Jan Lehnardt    schedule 27.12.2016

Я хотел бы добавить, что вы часто можете сохранить всю транзакцию в одном документе, а затем использовать просмотры в своих интересах, чтобы показать результаты.

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

Или, например, в вопросе : Если вы хотите, чтобы в базе данных одновременно был только один король, просто используйте документ с _id = 'king' и сохраните всю информацию о короле там. Если король меняется, просто измените фактические данные короля в этом документе. Вы получите конфликт, если два клиента попытаются сменить короля одновременно. Кстати, это также отлично сработает, если вы используете несколько узлов или несколько реплик, например, для автономных клиентов через PouchDB. В конце концов вам придется подумать о разрешении конфликтов, но по замыслу вы никогда не столкнетесь с двумя королями.

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

person Bernhard Gschwantner    schedule 05.01.2017