2012-02-29 4 views
1

는이 기사의 예제에 대한 질문이 : 나도 같은 개체 그룹에 아담과 밥을 넣어엔티티 그룹 내의 업데이트는 커밋이 반환 된 후 그룹 내의 읽기에 항상 표시됩니까?

http://code.google.com/appengine/articles/transaction_isolation.html

한다고 가정을 만 아담과 밥의 높이를 확인하려면 (즉, 액세스 동작 getTallPeople 수정 엔티티 그룹의 엔티티 만). 지금, 나는 다음과 같은 문장을 실행하는 경우 :

begin transaction 
updatePerson (update Adam's height to 74 inches) 
commit transaction 

begin transaction 
getTallPeople 
commit transaction 

내가 getTallPeople 항상 아담과 밥을 모두 반환됩니다 확신 할 수 있습니까? 나는. 엔티티/인덱스 업데이트가 완료되지 않은 경우 두 번째 트랜잭션이 완료 될 때까지 기다릴 것입니까? 또한 getTallPeople에 대한 트랜잭션을 사용하지 않고 동작이 동일할까요?

도움 주셔서 감사합니다.

답변

0

예. getTallPeople을 트랜잭션 내에서 호출하려면 쿼리에 "조상 (ancestor)"필터를 사용하여 결과를 그룹의 구성원으로 제한해야합니다. 그렇지 않으면 결과를 판별하는 데 사용하는 색인 ​​데이터와 해당 결과에 따라 반입하는 엔티티가 이전 트랜잭션의 커미트 결과와 강하게 일치합니다. 쿼리가 조상 필터를 사용하고 HR 데이터 저장소를 사용하는 경우에도 명시적인 트랜잭션이 없으면이 사실이 적용됩니다.

getTallPeople이 조상 필터없이 쿼리를 수행하고 HR 데이터 스토어를 사용하는 경우 글로벌 인덱스 데이터를 사용합니다 (HR 데이터 스토어는 잠시 동안 기본값 이었으므로 아마도 사용하고있을 것입니다). 이는 결국 데이터 세트에서 일관되게 만 보장됩니다. 이 경우 이전 트랜잭션이 이미 커밋 된 경우에도 쿼리는 이전 트랜잭션 이전에 그룹에 대한 인덱스 데이터를 볼 수 있습니다.

+0

HR 데이터 스토어가 조상 쿼리가 명시 적 트랜잭션 외부의 그룹 인덱스 데이터와 일치하는 결과 엔터티를 반환하는지 확인하는 내용으로 내 대답을 업데이트했습니다. –

관련 문제