-2

그 방법에는 데이터베이스에 세 가지 모델 레코드를 삽입하는 방법이 있습니다. 하지만 일부 예외 또는 오류가 발생하면 db에서이 삽입 트랜잭션을 롤백해야합니다. 다음은 메소드의 사례입니다.GAE에서 롤백 데이터 저장소 PUT 트랜잭션 파이썬 웹

def post(): 
    try: 
     model1 = Model1() 
     model1.key1 = 'key1' 
     model1.key2 = 'key2' 
     model1.put() 

     #some logic1 code block goes here 
     . 
     . 
     model2 = Model2() 
     model2.key2 = 'key2' 
     model2.key2 = 'key2' 
     model2.put() 

     #some logic2 code block goes here 
     . 
     . 
     model3 = Model3() 
     model3.key3 = 'key3' 
     model3.key3 = 'key3' 
     model3.put() 

     #some logic3 block goes here 
     . 
     . 
    except Exception: 
     #all the database insertion transaction which happened should be rollback here. 

여기 모델 1, 모델 2 및 Model3는 google.appengine.ext.ndb.Model 연장 모델 클래스이다. logic1 code block에서 예외가 발생했다고 가정하면이 logic1 code block을 실행하기 전에 model1이 롤백되어야하기 때문에 삽입해야합니다. 마찬가지로 logic2 code block에서 예외가 발생한 경우 model1 & model2 이상이 롤백되어야합니다. 내 문제는 매우 흔합니다. 나는 많은 검색을했지만 어떤 해결책도 찾을 수 없었다. 나는 파이썬과 GAE에서 완전히 새로운 편이다. 도와주세요.

+1

나는 "많은 검색"을했지만 해결책을 찾지 못했다고 생각합니다. "NDB Transaction"에 대한 간단한 검색은 [이 페이지] (https://cloud.google.com/appengine/docs/python/ndb/transactions)를 반환합니다. –

+0

빠른 응답에 감사드립니다. 그러나 나는 그것이 나를 돕지 않는다고 생각한다. 데이터베이스에 레코드를 삽입 한 후 오류가 발생하면 삽입 된 레코드를 롤백하고 싶습니다. @ ndb.transactional을 사용할 때 작동하지 않습니다. 문서 링크 대신 대답을위한 해결책이나 아이디어를 주면 도움이 될 것입니다. –

+0

예외를 발생시킬 수있는 모든 로직 주위에 데코레이터를 배치합니다. –

답변

-1

@Daniel Roseman으로 연결하면 답변은 NDB Transaction page입니다. "롤백"이라는 단어를 검색하면 해당 단어가 나타납니다. 코드에 대한

,이 의미 데코레이터에 난 당신의 코드에서부터 xg-True 지정이 대부분 크로스 엔티티 그룹 트랜잭션이었다 것처럼 보였다 니펫을 한 것으로

@ndb.transactional(xg=True) 
def post(): 
    try: 
     model1 = Model1() 
     model1.key1 = 'key1' 
     model1.key2 = 'key2' 
     model1.put() 

     ... 

     #some logic3 block goes here 
     . 
     . 
    except Exception: 
     #all the database insertion transaction which happened should be rollback here. 
     raise ndb.Rollback 

참고. 이것이 사실이 아니고 모든 엔티티가 동일한 루트 조상을 가지면이를 생략 할 수 있습니다.

또한 ndb.Rollback은 순전히 편리한 예외입니다. 트랜잭션 데코 레이팅 된 함수에서 발생한 예외는 롤백을 유발합니다.

+0

@ Dan, 감사하지만 현재 코드에서 구현할 때 "BadRequestError : 거래 내에서 조상 쿼리 만 허용됩니다"예외가 발생합니다. 저는 파이썬과 GAE에서 완전히 새로운 것입니다. 이 예외는 ndb.query() 메소드를 사용하여 데이터베이스에서 레코드를 가져 오는 동안 발생합니다. –

+0

@vijayshegokar - 귀하의 질문은 puts 및 gets 만 보여줍니다. - Datastore 쿼리는 중요한 정보이므로 생략해서는 안됩니다. 문서별로 트랜잭션 내에서 조상 만 쿼리 할 수 ​​있습니다. 어쨌든 여기에 다른 유형의 쿼리를 사용해서는 안됩니다. 조상 제한없이 결국 일관성이 있기 때문입니다. 디자인을 재고해야합니다. https://cloud.google.com/datastore/docs/concepts/transactions –