대량 저장을 수행하는 동안 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는 문서 간의 일관성이 매우 중요하지만 잠금이없는 환경이므로 매우 어려워지고 있습니다.
예를 줄일 수 있지만, 어떻게 경쟁 조건을 해결한다? 총액이 음수가 될 수 없다는 것보다 더 지출하지 못한다고 가정 해 보겠습니다. 현재 20 달러를 지갑에 가지고 있습니다. 이제 두 개의 "지출"프로세스가 각각 20 $를 그리는 동시에 시작한다고 가정 해 봅시다. 그들은 지갑에있는 금액을 확인한 다음 지출을 시작합니다. 두 번째 프로세스가 첫 번째 트랜잭션을 확인한 후 트랜잭션을 완료하면 첫 번째 트랜잭션은 마이너스 -20 $로 갈 수 있습니다. – pewpewlasers
@pewpewlasers 좋은 질문입니다. 나의 첫 번째 생각은 그것이 은행에서 어떻게 행해지는지 모방하는 것이다 : 거래가 생성되었지만 무효 명령이 보내졌다. 예를 들어, [_changes'API (https://github.com/iriscouch/follow)를 경청하는 [NodeJS 프로세스]를 사용하여 해당 사용자의 계정 잔액을 얻도록보기를 요청하고 무효화 명령을 전송할 수 있습니다 (당좌 대행 한도를 초과하는 경우 특별 서류). –
제안에 감사드립니다. 나는 당신의 방법을 시도 할 것입니다. – pewpewlasers