2016-10-06 3 views
3

목표는 저장 프로 시저 또는 트리거를 작성하여 문서를 읽고 바꾸고 한 트랜잭션에서 메타 데이터 문서를 업데이트 할 수있게하는 것입니다.DocumentDb 저장 프로 시저 및 낙관적 동시성

이제 컬렉션에 순차적으로 쓰는 경우 의도 한대로 작동하지만 여러 병렬 저장 프로 시저를 실행하는 경우 수동으로 etags를 비교하도록 스크립트를 구성해야합니까, 아니면 서버 측 스크립트?

this article에서 몇 가지 예를 읽은 후 읽기 교체 작업 도중에 etag가 변경되면 트랜잭션이 자동으로 실패 할 것이라는 인상을 받았습니다. 그러나 this example에서 작성자는 requestOptions 객체에 etag를 포함하고 replaceDocument 메소드에이를 전달합니다. 마찬가지로 클라이언트 측에서 .NET SDK를 사용하여이를 수행하고 있습니다.

이러한 불일치로 인해 혼란 스러웠습니다. 그래서 내 질문은 : 서버 측 스크립트의 경우 낙관적 동시성을 시행하기 위해 requestOptions 객체에 etag를 포함해야 하는가, 아니면 기본 동작인가?

+1

좋은 질문입니다. 나는 항상 내 [sprocs] (https://github.com/lmaccherone/documentdb-utils/blob/master/sprocs/updateSomeDocuments.coffee)에서 etags를 사용했다. (아마도 방어 적으로) 나는 각 sproc 독자적으로 실행되며 일관성없는보기를 읽기 및 쓰기 할 기회가 없기 때문에 필요하지 않다고 생각합니다. –

답변

2

각 스크립트는 하나의 트랜잭션으로 실행됩니다. 스냅 숏 격리로 인해 두 스크립트가 동일한 문서를 업데이트 할 때 업데이트 성공시 두 스냅 샷이 모두 업데이트되지 않았을 때 다른 스냅 숏이 실패하면 다른 쪽에서는 해당 문서를 업데이트 할 수 없습니다. , 그것의 스냅 샷보다 나중에 스크립트를 종료 할 수/클라이언트로 돌아가려면 클라이언트의 스크립트를 다시 실행해야 할 것이라고 의사의 버전을 읽을 수 없기 때문에. 그 때문에 동시에 보호를 위해 etags를 사용하는 것은 도움이되지 않습니다.