2014-11-07 1 views
2

Azure DocumentDB에서 문서의 정수를 원자 적으로 증분하는 방법은 무엇입니까?Azure DocumentDB에서 문서의 정수를 원자 적으로 증가시킵니다.

증가 작업은 동시 작성자가있는 상태에서 원자 적이어야합니다. 잃어버린 증분은 허용되지 않습니다 (단순한 읽기 - 수정 - 쓰기 알고리즘에서 가능할 것입니다). documentation에서

+0

"순진한 읽기 - 수정 - 쓰기 알고리즘에서 가능할 것입니다"라는 말은 무엇을 의미합니까? 모든 문서는 Etag를 가지고 있으며 현재가 아닌 Etag로 보내진 모든 변경 사항은 거부 될 것입니다 (HTTP 412) [http://azure.microsoft.com/en-us/documentation/articles/documentdb-faq/#develop) – b2zw2a

+0

감사합니다. 그것은 대답 일 것입니다. 추가하고 싶지 않다면 나중에 추가하겠습니다. – usr

답변

3

:

어떻게 DocumentDB 동시성을 제공합니까?

DocumentDB는 HTTP 엔터티 태그 또는 ETags를 통해 낙관적 동시성 제어 (OCC)를 지원합니다. 모든 DocumentDB 리소스에는 ETag가 있고 DocumentDB 클라이언트는 최신 읽기 버전을 쓰기 요청에 포함시킵니다. ETag가 최신 상태이면 변경 내용이 커밋됩니다. 값이 외부 적으로 변경된 경우 서버는 "HTTP 412 Precondition failure"응답 코드로 쓰기를 거부합니다. 클라이언트는 최신 버전의 리소스를 읽고 요청을 다시 시도해야합니다.

하나는 구현이 속성을 사용할 수있는 CAS loop :

while (true) { 
    var existingDoc = ReadDoc(); 

    existingDoc.Int++; 

    try { 
    WriteDoc(existingDoc); 
    break; 
    } 
    catch { //Concurrency violation 
    continue; 
    } 
} 

또한 푸른 DocumentDB의 트랜잭션 데이터 (스냅 샷 격리)의 스냅 샷에서 실행 있습니다.

BTW : 좀 더 자동화 된 (누군가가 문서를 수정할 때 자동 증가) 것을 원하면 정수의 현재 값에 대해 트리거와 분리 된 콜렉션을 사용할 수 있습니다. 트리거는 동일한 트랜잭션에서 실행되므로 일관되고 자동화됩니다.