2012-10-11 4 views
1

내 앱 엔진 데이터 저장소 코드를 디자인하려고하는데 잠재적 인 문제를 생각해 보았고 문서에서 특정 상황에서 발생할 수있는 구체적인 정보를 찾을 수 없었습니다.엔티티의 조상이 존재하지 않으면 생성됩니까 (Java API)?

조상이있는 엔티티를 저장하기 전에 저장하기 전에 해당 조상이 하나의 트랜잭션에 존재하는지 확인하고 존재하지 않으면 상위 항목을 만듭니다. 다음으로 엔티티를 저장하고 이전 단계에서 찾거나 생성 한 조상 키를 사용하여 엔티티를 저장 한 다른 트랜잭션을 시작합니다. 단일 사용자 또는 소수의 사용자 만 테스트 할 경우 동시 수정 기회가 최소 일 때 문제가되지는 않지만 배포 된 후에는 첫 번째 트랜잭션 (조상 생성/검색)과 두 번째 트랜잭션 (상위 엔티티의 하위 항목으로 엔티티 추가)을 사용하면 다른 사용자가 조상을 삭제할 수 있습니다.

초기 생각은이 모든 것을 하나의 트랜잭션으로 발생시키는 것이었지만 조상이 존재하지 않아 생성 되어야만하는 경우에는 생성하려는 엔터티가 존재하는지 확인하기위한 조상 쿼리가 실패했습니다. 데이터 저장소의 스냅 샷 격리 모델. 그러나 이것이 맞는지 확실하지 않습니다.

누구든지이 문제에 대해 지식이 있습니까? 조상이 삭제 된 경우, 엔티티는 여전히 아무것도 나타내지 않는 상위 키로 작업을 계속 진행합니까? 이것은 부모를 다시 생성 할 것인가? 그래서 미래의 체크가 동일한 키를 반환 할 것인가? 나는이 상황을 시험 할 것이지만 그렇게 할 실제 방법을 고안 할 수는 없다.

답변

1

가능한 해결책은 조상 (쿼리가 아닌)을 직접 가져오고 개체가 null 인 경우 트랜잭션 내에서 조상과 하위 항목을 모두 만들 수 있습니다. 이는 생성시이 두 엔티티가 동일한 엔티티 그룹에 속하지 않으므로 상호 그룹 트랜잭션 (XG 트랜잭션)을 모방합니다. XG 거래에 대한

자세한 내용은

는 좀 봐 :이 도움이

희망을!

+0

입력 해 주셔서 감사합니다. 나는 오늘 그렇게하는 방법을 살펴보고 돌아와서 유망 해 보이는 대답을 받아 들일 것입니다. – Jared

0

대답은 ", 여전히 생성됩니다"라고 생각합니다.

이 동작은 Python 또는 Java API에만 해당해서는 안됩니다. 키에 조상이 존재하지 않는 엔티티를 만들려고 시도했지만 Google Cloud Datastore에서 작동하는 것으로 보입니다.

이 논리는 Datastore가 "이 키가 속한 엔티티 그룹은 무엇입니까?"라는 질문에 대한 답을 기반으로한다고 생각합니다. 나는 그 결정이 최상위 조상을 확인함으로써 이루어 졌다고 가정 할 것이다. 이것은 이있는 키가 최상위 조상 인이 존재하는지 여부는 중요하지 않다는 것을 의미 할 것이다.

즉, Key.from_path('Kind1', 'parent')Key.from_path('Kind1', 'parent', 'Kind1', 'child')이 둘 다 동일한 엔티티 그룹에 (서로 독립적으로) 배치되는 경우 추가되는 순서는 부적절하며 첫 번째 그룹의 존재 여부는 그룹과 관련이 없습니다 두 번째는 살 것입니다.

일부 예제 코드 : 더 '부모'(kind='Person', key_name='parent'가 존재하지 않는 기업)이 ​​없도록

from gcloud.datastore import demo 
from gcloud.datastore.entity import Entity 
from gcloud.datastore.key import Key 

dataset = demo.get_dataset() 
entity = Entity() 
key = Key.from_path('Person', 'parent', 'Person', 'child').dataset(dataset) 
entity = entity.key(key) 
entity.save() 

참고.

관련 문제