MongoDB
 sql >> база данни >  >> NoSQL >> MongoDB

CouchDB/Couchbase/MongoDB емулация на транзакция?

Couchdb е транзакционен по подразбиране. Всеки документ в couchdb съдържа _rev ключ. Всички актуализации на документ се извършват спрямо този _rev ключ:-

  1. Вземете документа.
  2. Изпратете го за актуализация чрез свойството _rev.
  3. Ако актуализацията е успешна, значи сте актуализирали последната _rev на документа
  4. Ако актуализацията е неуспешна, документът не е бил скорошен. Повторете стъпки 1-3.

Вижте този отговор от MrKurt за по-подробно обяснение.

couchdb рецепти има банков пример, който показва как се извършват транзакции в couchdb.

Има и този атомни банкови преводи статия, която илюстрира транзакции в couchdb.

Както и да е, общата тема във всички тези връзки е, че ако следвате модела на couchdb за актуализиране спрямо _rev не можете да имате непоследователно състояние във вашата база данни.

Всички couchdb документи са уникални след _id полетата в два документа не могат да бъдат еднакви. Разгледайте вижте готварската книга

Редактиране въз основа на коментар

В този случай можете да използвате отделни документи. Вмъквате документ, изчаквате отговора за успех. След това добавете друг документ като

{_id:'some_id','count':1}

С това можете да настроите изглед за намаляване на картата, който просто брои резултатите от тези документи и имате брояч за актуализиране. Всичко, което правите, е вместо да актуализирате един документ за актуализации, вие вмъквате нов документ, за да отразите успешно вмъкване.

Добре, така че вече описах как можете да правите актуализации на отделни документи, но дори когато актуализирате един документ, можете да избегнете несъответствие, ако:

  1. Вмъкване на нов файл
  2. Когато couchdb даде съобщение за успех -> опитайте да актуализирате брояча.

Защо това работи?

Това работи, защото когато се опитате да актуализирате update document трябва да предоставите _rev низ. Можете да помислите за _rev като местно състояние за вашия документ. Помислете за този сценарий:-

  1. Прочетохте документа, който трябва да бъде актуализиран.
  2. Променяте някои полета.
  3. Междувременно друга заявка вече е променила оригиналния документ. Това означава, че документът вече има нов _rev
  4. Но вие изисквате couchdb да актуализира документа с _rev който е stale което сте прочели в стъпка №1.
  5. Couchdb ще генерира изключение.
  6. Прочитате документа отново и получавате най-новата _rev и се опитайте да го актуализирате.

Така че, ако направите това, винаги ще трябва да актуализирате спрямо последната версия на документа. Надявам се, че това прави нещата малко по-ясни.

Забележка:

Както посочи Daniel the _rev правилата не се прилагат за групови актуализации.



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Какво правя погрешно с $set и $inc в актуализацията

  2. Eclipselink с MongoDB java.lang.ClassCastException

  3. Автоматично увеличение на Mongoose

  4. MongoDB докер контейнер Неуспешно прекъсване на връзката на сокет файл

  5. Как да изпълня заявка в Mongoose?