Я могу сделать транзакции и привязываю CouchDB?

79
задан APC 6 April 2010 в 04:23
поделиться

4 ответа

Нет. CouchDB использует модель "оптимистичного параллелизма". Простым языком это просто означает отправку версии документа наряду с обновлением, и CouchDB отклоняет изменение, если версия текущего документа не соответствует тому, что Вы отправили.

Это обманчиво просто, действительно. Можно повторно структурировать много нормальных основанных на транзакции сценариев для CouchDB. Действительно необходимо отсортировать, выводят знания проблемной области RDBMS при изучении CouchDB, все же. Полезно приблизиться к проблемам от более высокого уровня, вместо того, чтобы пытаться прессовать Диван к основанному на SQL миру.

Отслеживание материально-технических ресурсов

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

  1. Получают документ, принимают во внимание _rev свойство, которое CouchDB отправляет вперед
  2. Декремент поле количества, если это больше, чем нуль
  3. Передает обновленный документ обратно, с помощью _rev свойство
  4. Если _rev соответствия в настоящее время хранившее число, быть сделанным!
  5. , Если существует конфликт (когда _rev не соответствует), получите новейшую версию документа

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

Теперь, ответ, который я просто дал, предполагает, что Вы собираетесь сделать вещи в CouchDB почти таким же способом, которым Вы были бы в RDBMS. Я мог бы приблизиться к этой проблеме немного по-другому:

я запустил бы с "основного продукта" документ, который включает все данные дескриптора (имя, изображение, описание, цена, и т.д.). Тогда я добавил бы "документ" билета материально-технических ресурсов для каждого определенного экземпляра с полями для product_key и claimed_by. Если Вы продаете модель молотка и имеете 20 из них для продажи, у Вас могли бы быть документы с ключами как hammer-1, hammer-2, и т.д., для представления каждого доступного молотка.

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

Карта

function(doc) 
{ 
    if (doc.type == 'inventory_ticket' && doc.claimed_by == null ) { 
        emit(doc.product_key, { 'inventory_ticket' :doc.id, '_rev' : doc._rev }); 
    } 
}

Это дает мне список доступных "билетов" ключом продукта. Я мог захватить группу их, когда кто-то хочет купить молоток, затем выполнить итерации посредством отправки обновлений (использующий id и _rev), пока я успешно не буду требовать одного (ранее требуемые билеты приведут к ошибке обновления).

Уменьшают

function (keys, values, combine) {
    return values.length;
}

, Это уменьшает функцию, просто возвращает общее количество невостребованных inventory_ticket объекты, таким образом, можно сказать, сколько "молотков" доступно для покупки.

Протесты

Это решение представляет примерно 3,5 минуты общего количества, думающего для конкретной проблемы, которую Вы представили. Могут быть лучшие способы сделать это! Однако это действительно существенно уменьшает конфликтующие обновления и сокращает потребность ответить на конфликт с новым обновлением. Под этой моделью, у Вас не будет многочисленных пользователей, пытающихся изменить данные в основной записи продукта. В очень худшем, у Вас будут многочисленные пользователи, пытающиеся требовать билета в один конец, и если Вы захватили несколько из тех от Вашего представления, Вы просто идете дальше к следующему билету и попробовали еще раз.

Ссылка: https://wiki.apache.org/couchdb/Frequently_asked_questions#How_do_I_use_transactions_with_CouchDB.3F

139
ответ дан Luccas 24 November 2019 в 10:08
поделиться

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

24
ответ дан Kerr 24 November 2019 в 10:08
поделиться

На самом деле Вы можете в некотором роде. Взгляните на документ API HTTP и прокрутите вниз к заголовку, "Изменяют Несколько Документов С Единственным Запросом".

В основном можно создать/обновить/удалить набор документов в единственном запросе сообщения к URI / {dbname} / _bulk_docs, и они или все успешно выполнятся или весь сбой. Документ действительно предостерегает, что это поведение может измениться в будущем, все же.

РЕДАКТИРОВАНИЕ: Как предсказано, от версии 0.9 объемные документы больше не прокладывает себе путь.

3
ответ дан Evan 24 November 2019 в 10:08
поделиться

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

  • Создайте документ транзакции «перевод 10 долларов США со счета 11223 на счет 88733». Это создает напряжение в системе.
  • Чтобы устранить любое напряжение, сканирование для всех транзакционных документов и В приведенном выше примере будет кратковременное ожидаемое несоответствие, когда первая учетная запись была обновлена, а вторая еще не обновлена. Это необходимо учитывать так же, как вы будете иметь дело с возможной согласованностью, если ваш Couchdb является распределенным.

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

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

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

20
ответ дан 24 November 2019 в 10:08
поделиться
Другие вопросы по тегам:

Похожие вопросы: