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:- - Obtenha o documento.
- Envie-o para atualização usando a propriedade _rev.
- Se a atualização for bem-sucedida, você atualizou a _rev mais recente do documento
- 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:
- Inserir um novo arquivo
- 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:- - Você leu o documento que deve ser atualizado.
- Você altera alguns campos.
- Enquanto isso, outra solicitação já alterou o documento original. Isso significa que o documento agora tem um novo
_rev
- Mas você solicita que o couchdb atualize o documento com um
_rev
isso éstale
que você leu na etapa 1. - O Couchdb gerará uma exceção.
- 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.