2016-12-26 9 views
1

로 정의 설계 문서의 validate_doc_update 기능은,이 가정 :단일 노드 CouchDB를, 다중 문서 거래

{ 
    "_id": "_design/ddoc", 
    "_rev": "12-133b5dad579f872884a9ccd6d4be5ee9", 
    "language": "javascript", 
    "validate_doc_update": "function(newDoc, oldDoc, userCtx) { 
     if (oldDoc._rev != newDoc._rev) { throw('FAILED') } 
    }" 
} 

우리가 대량 업데이트 (_bulk_docs)를 수행하는 경우; 하나 이상의 문서에 대해 다국적입니까?

참고 : this 답변을 찾았으며 문서를 읽고 테스트 코드를 실행했습니다. CouchDB에서 트랜잭션을 수행하는 완벽한 방법 인 것 같습니다! 그러나 나는 다른 장소에서 그것을 보지 못했기 때문에 (그리고 왜 그런지 궁금해했다.); 이것이 실수가 아님을 확인하고 싶었습니다.

답변

3

여기에 CouchDB dev.

이것은 이 아니고 트랜잭션이며, 단일 노드에서도 마찬가지입니다.

단일 노드 설치에서 클러스터 설치로 이동할 때 CouchDB에서 중단되는 API를 원하지 않기 때문입니다.

클러스터에서는 다중 문서 트랜잭션을 보장하기가 훨씬 어렵 기 때문에 CouchDB는이를 시도하지도 않습니다.

1

전체 트랜잭션을 단일 문서로 저장 한 다음 결과를 표시하기 위해 유리한 방향으로 뷰를 가져올 수 있다고 덧붙이고 싶습니다.

예를 들어, 입금 및 출금을 설명하는 두 개의 문서를 저장하는 대신 현금 전송을 저장하려면 두 가지를 모두 "양도"유형의 문서에 저장 한 다음 각 계정의 잔액을 반환하는보기를 생성하십시오.

또는 question you referred to의 예를 사용하십시오. 데이터베이스에 한 번에 하나의 왕만이 있도록하려면 _id = 'king'이있는 문서를 사용하고 거기에있는 왕에 대한 모든 정보를 저장하십시오 . 왕이 변경되면 해당 문서에서 왕의 실제 데이터를 변경하십시오. 두 명의 고객이 동시에 왕을 변경하려고하면 충돌이 발생합니다. Btw는 PouchDB를 통한 오프라인 우선 클라이언트의 경우와 같이 여러 개의 노드 또는 여러 개의 복제본을 사용한 경우에도 효과적입니다. 궁극적으로 갈등을 해결하는 것을 고려해야하지만 의도적으로 두 명의 왕을 만날 수는 없습니다.

그래서 : 필요에 따라 문서를 적절하게 모델링하십시오. 거래가 필요한 경우 각 거래를 단일 문서로 저장하십시오.