5

앱 엔진에서 DB 트랜잭션을 처리하는 방법은 다른 엔터티에 Parent (엔터티 그룹)을 지정하고 db.run_in_transaction을 사용하는 것입니다.Google 애플리케이션 엔진에서 데이터베이스 트랜잭션을 구현하려면 어떻게해야합니까?

그러나 나는 이 아니며은 두 개체에 동일한 부모를 부여 할 수 있다고 가정합니다. 거래에서 DB 업데이트가 발생하도록하려면 어떻게해야합니까?

기술적 인 솔루션이 있습니까? 그렇지 않다면 내가 적용 할 수있는 패턴이 있습니까?

참고 : 저는 Python을 사용하고 있습니다.

답변

5

엔티티가 동일한 그룹에 속해있는 한 이것은 문제가되지 않습니다. docs에서 :

트랜잭션의 모든 데이터 저장소 작업은 같은 엔티티 그룹의 실체 에서 작동해야합니다. 이 은 엔티티를 조상으로 쿼리하고, 엔티티를 키로 ​​검색하고, 엔티티를 업데이트하고, 엔티티를 삭제합니다. 각 루트 엔터티 은 별도의 엔터티 그룹에 속하므로 단일 트랜잭션으로는 만들 수 없거나 둘 이상의 루트 엔터티에서 을 조작 할 수 없습니다. 엔티티 그룹에 대한 설명은 에서 키 및 엔티티 그룹을 참조하십시오.

Transaction Isolation in App Engine에 대한 멋진 기사가 있습니다.

편집 : 당신이 동일한 트랜잭션에서 다른 부모와 함께 엔티티를 업데이트해야하는 경우, 당신은 자신에 의해 예외가 발생하면 수동으로 롤백 된 변경을 직렬화하는 방법을 구현해야합니다.

+0

을하지만 당신은 "키와 엔티티 그룹"http://code.google.com/appengine/docs/에 대한 링크를 따라하는 경우 python/datastore/keysandentitys.html # Entity_Groups_Ancestors_and_Paths, 동일한 엔티티 그룹에 두 엔티티를 배치하는 유일한 방법은 조상을 공유하는 것입니다. –

+0

죄송합니다. 기술적으로는 부모가 아닌 그룹을 의미한다고 가정합니다. 그러나 예, 내가 읽고있는 책에 따르면, 파이썬에서 그룹을 지정하는 유일한 방법은 공통 조상/부모를 통해하는 것입니다. – willem

+0

@James @Willem 둘 다 맞습니다. 엔티티는 동일한 루트/부모 노드를 공유하는 경우에만 그룹으로 간주됩니다. 내 대답을 편집했습니다. – jbochi

2

AppEngine 데이터 저장소의 트랜잭션은 SQL 데이터베이스에서 사용되었을 수있는 트랜잭션과 다르게 작동합니다. 첫째, 트랜잭션은 실제로 작동중인 엔티티를 잠그지 않습니다.

이 문서에서는 Translation Isolation in App Engine에 대해 자세히 설명합니다.

이 때문에 트랜잭션에 대해 다르게 생각하고 싶을 것입니다. 트랜잭션을 사용하려는 대부분의 경우 불필요한 것이거나 그렇지 않은 트랜잭션 필요.

엔티티 그룹 및 데이터 저장소 모델에 대한 자세한 내용은 How Entities and Indexes are Stored을 참조하십시오.

Handling Datastore Errors은 트랜잭션을 커밋하지 못하게하고 문제를 처리하는 방법에 대해 이야기합니다.

2

하나의 가능성은 앞서 언급 한 것처럼 자체 트랜잭션 처리를 구현하는 것입니다. 이렇게하는 것에 대해 생각하고 있다면이 문제에 대한 이전 연구를 탐구 해 볼 가치가 있습니다.

http://danielwilkerson.com/dist-trans-gae.html

댄 윌커슨은 구글 IO의 IT에 대한 이야기를했다. 대화의 비디오를 찾을 수 있어야합니다.

+0

매우 유용합니다. 감사합니다. Kris. – willem

3

크로스 엔티티 그룹 트랜잭션을 원하면 직접 구현하거나 라이브러리에서 트랜잭션을 기다려야합니다. 나는 '은행 송금'케이스에서 상호 엔티티 그룹 트랜잭션을 구현하는 방법에 대해 얼마 전에 an article을 작성했습니다. 그것은 귀하의 유스 케이스에도 적용될 수 있습니다.

+0

+1 아주 좋은 기사! 고맙습니다! – jbochi

관련 문제