엔티티 그룹의 주요 용도는 트랜잭션에서 둘 이상의 엔티티를 업데이트하는 수단을 제공하는 것입니다.
사용하지 않았다면 축복을 계산하십시오. 어느 하나의 엔티티가 일관성을 유지하기 위해 동시에 업데이트 할 필요가없는 데이터 모델을 설계했거나 그렇지 않으면 필요하지만 운이 좋았습니다.
내가 가지고 있다고 상상해보십시오. 송장 엔티티 유형 및 LineItem 엔티티 유형이 있습니다. 하나의 인보이스에는 여러 개의 LineItem이 연결될 수 있습니다. My Invoice 엔티티에는 LastUpdated라는 필드가 있습니다. LineItem이 내 송장에 추가 될 때마다 LastUpdated 필드에 현재 날짜를 저장하려고합니다.
내 업데이트 기능이 (의사)처럼 보일 수 있습니다 송장 넣어()가 성공하고 LINEITEM 넣어()가 실패 할 경우
invoice.lastUpdated = now()
lineitem = new lineitem()
invoice.put()
lineitem.put()
은 어떻게됩니까? 인보이스 날짜에 무언가가 업데이트 되었음이 표시되지만 실제 업데이트 (새 LineItem)는 표시되지 않습니다. 해결책은 puts()를 트랜잭션 내부에 넣는 것입니다.
대체 솔루션은이 데이터를 lastUpdated 필드에 저장하는 대신 마지막으로 삽입 된 LineItem의 날짜를 찾기 위해 쿼리를 사용하는 것입니다. 하지만 라인 입력이 마지막으로 추가 된 시간을 알기 원할 때마다 인보이스와 모든 LineItem을 가져와 귀중한 데이터 스토어 할당량이 필요합니다.
편집은 포스터의 코멘트
아에 응답 할. 나는 당신의 혼란을 이해한다고 생각합니다. 위의 단락은 거래가 중요한 이유를 설명합니다. 그러나 엔티티 그룹이 트랜잭션과 어떤 관련이 있는지 알지 못하기 때문에 엔티티 그룹에 대해서는 신경 쓰지 않는다고 말합니다. 그러나 db.run-in-transaction을 사용하고 있다면 엔티티 그룹을 사용하고 있습니다. 모든 거래는 하나의 엔티티 그룹 만 포함하며, 주어진 거래는 동일한 그룹에 속한 엔티티에만 영향을 줄 수 있습니다. here
"는 트랜잭션의 모든 데이터 저장소 작업이 같은 엔티티 그룹의 실체 에 작동해야"을 참조하십시오.
거래 내에서 어떤 행동을 하시나요? 하나의 엔티티와 트랜잭션을 사용하는 데는 여러 가지 이유가 있습니다. 하나의 엔티티는 기본적으로 자체 엔티티 그룹에 있습니다.그러나 위의 예와 같이 두 개 이상의 항목을 동기화해야하는 경우가 있습니다. Invoice와 LineItem Entities가 같은 엔티티 그룹에 없다면 db.run-in-transaction 호출에서 수정 사항을 래핑 할 수 없습니다. 따라서 언제든지 두 개 이상의 엔티티를 트랜잭션 방식으로 조작하려는 경우 먼저 동일한 그룹에 있는지 확인해야합니다. 희망은 그들이 왜 유용한지를 더욱 분명하게 만듭니다.
거래에 db.run_in_transaction (http://code.google.com/appengine/docs/python/datastore/functions.html 참조)을 사용했습니다 (물론 해당 특수 사례의 경우 get_or_insert를 참조하십시오. http : //code.google.com/appengine/docs/python/datastore/transactions.html) - 엔티티 그룹의 이점은 무엇입니까? –
오우! 내 첫 downvote. 트랜잭션에 대한 엔티티 그룹 wrt의 장점은 트랜잭션이 엔티티 그룹 외부에서 작동하지 않는다는 것입니다. 트랜잭션을 사용했다면 암시 적으로 만 엔티티 그룹을 사용했습니다. 모든 엔티티는 기본적으로 그룹에 있습니다. 트랜잭션은 한 번에 하나의 엔티티 그룹에 영향을 미치는 범위가 제한됩니다. 나는 더 긴 설명으로 나의 대답을 편집했다. –
왜 이것을 downvoted입니까? 그것은 좋은 대답입니다. –