2017-02-07 2 views
2

대량 저장을 수행하는 동안 Couchdb에서 잠금을 만드는 방법이 있습니까? 이 방법을 구현할 수있는 방법은 없다고 생각합니다. 그러나 해결 방법으로이 문제를 해결할 수 있습니까? 이것이 내가 또한 필요가 저장 될 때대량 업데이트시 Couchdb 잠금 문서

{ 
    _id: SOMEID 
    type: "PAYMENT" 
    username: SOMEUSER 
    paidto: ANOTHERUSER 
    amount: 10 
} 

을 :

사용자가 다음과 같은 새 문서 객체를 생성하는 다른 사용자를 지불 : 나는 (내가 CouchDB를 데이터베이스와 상호 작용하는 Node.js를 사용) 다음과 같은 시나리오를 account document (사용자의 지갑에서 10을 뺀 금액)에 남아있는 잔액을 업데이트합니다. 그런 다음 bulk_docs (새로 만든 transaction document 및 업데이트 된 account document)를 사용하여이 두 문서를 한 번에 저장합니다.

그러나이 과정에서 사용자가 다른 방법을 통해 account document을 변경합니다 경우 우리가 account document 업데이트 할 수는 없지만 새로운 transaction document이 저장되는 문제가 (의 다른 탭에 가정 해 봅시다)

. 이로 인해 커다란 문제와 일관성 문제가 발생합니다.

이 문제를 해결하려면 대량 저장 프로세스가 끝날 때까지 account document을 잠 가야합니다.이 과정에서 두 번째 탭의 프로세스가 잠금 해제를 기다립니다.

배포를 시도하고 있습니다. Couchdb는 문서 간의 일관성이 매우 중요하지만 잠금이없는 환경이므로 매우 어려워지고 있습니다.

답변

1

이 항목을 저장하면 사용자가 자신의 계정 문서에있는 잔액을 업데이트해야합니다 (지갑에서 10을 뺍니다).

하지 마십시오. 문서 데이터베이스의 경우 뱅킹은 very well documented example입니다. 모범 사례는 트랜잭션 만 문서로 저장하고 계정 잔액은 뷰 (계정별로 인덱싱 된 트랜잭션)에 대한 쿼리로 간주하는 것이 좋습니다.

지도

function(o) { 
    if (o.paidto && o.amount && o.username) { 
    emit(o.paidto, o.amount); 
    emit(o.username, -o.amount); 
    } 
} 

_sum 

쿼리

GET /mydb/_design/mydesign/_view/myview/?group=true&key=SOMEUSER 
+0

예를 줄일 수 있지만, 어떻게 경쟁 조건을 해결한다? 총액이 음수가 될 수 없다는 것보다 더 지출하지 못한다고 가정 해 보겠습니다. 현재 20 달러를 지갑에 가지고 있습니다. 이제 두 개의 "지출"프로세스가 각각 20 $를 그리는 동시에 시작한다고 가정 해 봅시다. 그들은 지갑에있는 금액을 확인한 다음 지출을 시작합니다. 두 번째 프로세스가 첫 번째 트랜잭션을 확인한 후 트랜잭션을 완료하면 첫 번째 트랜잭션은 마이너스 -20 $로 갈 수 있습니다. – pewpewlasers

+0

@pewpewlasers 좋은 질문입니다. 나의 첫 번째 생각은 그것이 은행에서 어떻게 행해지는지 모방하는 것이다 : 거래가 생성되었지만 무효 명령이 보내졌다. 예를 들어, [_changes'API (https://github.com/iriscouch/follow)를 경청하는 [NodeJS 프로세스]를 사용하여 해당 사용자의 계정 잔액을 얻도록보기를 요청하고 무효화 명령을 전송할 수 있습니다 (당좌 대행 한도를 초과하는 경우 특별 서류). –

+0

제안에 감사드립니다. 나는 당신의 방법을 시도 할 것입니다. – pewpewlasers