아니요. CouchDB는 "낙관적 동시성"모델을 사용합니다. 가장 간단한 용어로 이것은 업데이트와 함께 문서 버전을 보내고 현재 문서 버전이 보낸 것과 일치하지 않으면 CouchDB가 변경을 거부한다는 것을 의미합니다.
정말 믿을 수 없을 정도로 간단합니다. CouchDB에 대한 많은 일반 트랜잭션 기반 시나리오를 재구성 할 수 있습니다. 하지만 CouchDB를 배울 때 RDBMS 도메인 지식을 버릴 필요가 있습니다. Couch를 SQL 기반 세계로 만들려고 시도하는 것보다 더 높은 수준에서 문제에 접근하는 것이 도움이됩니다.
재고 추적
설명하신 문제는 주로 재고 문제입니다. 항목을 설명하는 문서가 있고 "사용 가능한 수량"필드가 포함 된 경우 다음과 같은 동시성 문제를 처리 할 수 있습니다.
- 문서를 검색하고
_rev
CouchDB가 보내는 속성을 기록해 둡니다.
- 수량 필드가 0보다 큰 경우 감소
_rev
속성을 사용하여 업데이트 된 문서를 다시 보내기
- (가) 경우
_rev
현재 저장된 번호와 일치, 할!
- 충돌이있는 경우 (
_rev
일치하지 않는 경우 ) 최신 문서 버전을 검색합니다.
이 경우 고려해야 할 두 가지 가능한 실패 시나리오가 있습니다. 최신 문서 버전의 수량이 0 인 경우 RDBMS에서와 마찬가지로 처리하고 사용자에게 구매하고 싶은 것을 실제로 구매할 수 없다고 경고합니다. 최신 문서 버전의 수량이 0보다 큰 경우 업데이트 된 데이터로 작업을 반복하고 처음부터 다시 시작하면됩니다. 이로 인해 RDBMS보다 약간 더 많은 작업을 수행해야하며 충돌하는 업데이트가 자주 발생하면 약간 짜증이 날 수 있습니다.
이제 제가 방금 제시 한 대답은 RDBMS에서와 거의 같은 방식으로 CouchDB에서 작업을 수행 할 것이라는 전제를 전제로합니다. 이 문제에 조금 다르게 접근 할 수 있습니다.
모든 설명자 데이터 (이름, 사진, 설명, 가격 등)가 포함 된 "마스터 제품"문서로 시작하겠습니다. 그런 다음 product_key
및에 대한 필드가있는 각 특정 인스턴스에 대한 "인벤토리 티켓"문서를 추가합니다 claimed_by
. 당신이 망치의 모델을 판매하고, 판매에 20을 가지고 있다면, 당신은 같은 키를 사용하여 문서에있을 수 있습니다 hammer-1
, hammer-2
사용 가능한 각 망치를 표현하기 위해, 등.
그런 다음 "총계"를 볼 수있는 축소 기능과 함께 사용 가능한 해머 목록을 제공하는 뷰를 만듭니다. 이것들은 커프에서 완전히 벗어 났지만 작업 뷰가 어떻게 생겼는지에 대한 아이디어를 제공해야합니다.
지도
function(doc)
{
if (doc.type == 'inventory_ticket' && doc.claimed_by == null ) {
emit(doc.product_key, { 'inventory_ticket' :doc.id, '_rev' : doc._rev });
}
}
이것은 제품 키별로 사용 가능한 "티켓"목록을 제공합니다. 누군가 망치를 사고 싶을 때이 그룹을 잡고 업데이트를 보낼 때까지 반복 할 수 있습니다 ( id
및 사용 _rev
).
줄이다
function (keys, values, combine) {
return values.length;
}
이 축소 기능은 청구되지 않은 총 inventory_ticket
항목 수를 반환 하므로 구매할 수있는 "망치"수를 알 수 있습니다.
주의 사항
이 솔루션은 귀하가 제시 한 특정 문제에 대해 대략 3.5 분의 총 사고를 나타냅니다. 더 나은 방법이있을 수 있습니다! 즉, 충돌하는 업데이트를 크게 줄이고 새로운 업데이트로 충돌에 대응할 필요성을 줄입니다. 이 모델에서는 기본 제품 항목의 데이터를 변경하려는 여러 사용자가 없습니다. 최악의 경우 여러 명의 사용자가 단일 티켓을 요청하게되며,보기에서 여러 사용자를 확보 한 경우 다음 티켓으로 이동하여 다시 시도하면됩니다.
참조 : https://wiki.apache.org/couchdb/Frequently_asked_questions#How_do_I_use_transactions_with_CouchDB.3F