MongoDB
 sql >> Base de Dados >  >> NoSQL >> MongoDB

Emulação de transação CouchDB/Couchbase/MongoDB?


O Couchdb é transacional por padrão. Todo documento no couchdb contém um _rev chave. Todas as atualizações de um documento são realizadas neste _rev chave:-
  1. Obtenha o documento.
  2. Envie-o para atualização usando a propriedade _rev.
  3. Se a atualização for bem-sucedida, você atualizou a _rev mais recente do documento
  4. Se a atualização falhar, o documento não é recente. Repita as etapas 1 a 3.

Confira esta resposta de MrKurt para uma explicação mais detalhada.

As receitas do Couchdb tem um exemplo bancário que mostra como as transações são feitas no couchdb.

E há também esta transferências bancárias atômicas artigo que ilustra as transações no couchdb.

De qualquer forma, o tema comum em todos esses links é que, se você seguir o padrão couchdb de atualização em um _rev você não pode ter um estado inconsistente em seu banco de dados.

Todos os documentos couchdb são únicos desde o _id campos em dois documentos não podem ser iguais. Confira o ver livro de receitas

Editar com base no comentário

Você pode usar documentos separados neste caso. Você insere um documento, aguarda a resposta de sucesso. Em seguida, adicione outro documento como

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

Com isso você pode configurar uma visualização de redução de mapa que simplesmente conta os resultados desses documentos e você tem um contador de atualização. Tudo o que você está fazendo é, em vez de atualizar um único documento para atualizações, está inserindo um novo documento para refletir uma inserção bem-sucedida.

Ok, então eu já descrevi como você pode fazer atualizações em documentos separados, mas mesmo ao atualizar um único documento, você pode evitar inconsistência se:
  1. Inserir um novo arquivo
  2. Quando o couchdb der uma mensagem de sucesso -> tente atualizar o contador.

Por que isso funciona?

Isso funciona porque quando você tenta atualizar o update document você deve fornecer um _rev corda. Você pode pensar em _rev como um estado local para o seu documento. Considere este cenário:-
  1. Você leu o documento que deve ser atualizado.
  2. Você altera alguns campos.
  3. Enquanto isso, outra solicitação já alterou o documento original. Isso significa que o documento agora tem um novo _rev
  4. Mas você solicita que o couchdb atualize o documento com um _rev isso é stale que você leu na etapa 1.
  5. O Couchdb gerará uma exceção.
  6. Você lê o documento novamente e obtém o _rev mais recente e tente atualizá-lo.

Portanto, se você fizer isso, sempre terá que atualizar com a última revisão do documento. Espero que isso deixe as coisas um pouco mais claras.

Observação:

Conforme apontado por Daniel, o _rev as regras não se aplicam a atualizações em massa.