Может ли обработчик обновления документа CouchDB получить конфликт обновления? - PullRequest
9 голосов
/ 06 июня 2010

Насколько вероятен конфликт версий при использовании обработчика обновлений? Должен ли я заботиться о коде обработки конфликтов при написании надежной функции обновления?

Как описано в ДокументеОбработчики обновлений , CouchDB 0.10 и более поздние версии позволяют изменять документы на стороне сервера по требованию.

Обработчики обновлений могут обрабатывать форматы не в формате JSON;но есть и другие важные особенности:

  • HTTP-интерфейс для произвольно сложного кода модификации документа
  • Подобный код не нужно писать для всех возможных клиентов - архитектура DRY
  • Выполнение выполняется быстрее и с меньшей вероятностью приведет к конфликту ревизий

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

1 Ответ

11 голосов
/ 06 июня 2010

Конфликты обновления все еще возможны при использовании обработчиков обновлений.

Из-за сокращенного «времени прохождения туда-обратно» вероятность конфликта обновления ниже, но не равна нулю.Конфликт будет выглядеть нормально: код ответа 409 с этим JSON:

{"error":"conflict","reason":"Document update conflict."}

Я успешно вызвал конфликт, используя пример обработчика обновления документов , и дважды выполнил curl подряд вshell.

curl -v -X PUT \
http://localhost:5984/db/_design/app/_update/accumulate/my_doc?amount=10 \
& curl -X PUT \
  http://localhost:5984/db/_design/app/_update/accumulate/my_doc?amount=1

Один из ответов скручивания (случайным образом) был 201, а другой - 409.

Обработчики обновления документов принципиально не меняют CouchDB

Обновленияподвержены конфликтам, а также ошибкам проверки (401 Unauthorized, 403 Forbidden и т. д.)

...