2

У меня есть служба webapp2, в которую вставляются записи в нескольких моделях NDB, которые не являются взаимозависимыми. Теперь нам требуется, чтобы служба была в транзакции. То есть что-то не в службе, то он должен вернуть полную транзакцию (например, если запись в вставлен в первой & второй модели и после этой операции не удается, то он должен удалить запись вставляется в первой модели.)поддержка транзакций ndb для обновления/откат нескольких записей модели ndb в той же транзакции

Я смотрел в транзакции ndb, но выглядит его не очень полезным, поскольку он работает только для одной модели за раз. Также я просмотрел транзакции с перекрестными группами, но это не требуется для моей структуры данных.

Например

Структура модели

class ModelTestA(ndb.Model): 
    field1 = ndb.StringProperty() 
    field2 = ndb.StringProperty() 

class ModelTestB(ndb.Model): 
    field1 = ndb.StringProperty() 
    field2 = ndb.StringProperty() 

webapp2 Сервис

from google.appengine.ext import ndb   
from google.appengine.api import datastore_errors 
@ndb.transactional(xg=True) 
def put_entity(): 
    try: 
     testa_obj = ModelTestA() 
     testa_obj.field1 = "ModelAF1" 
     testa_obj.field2 = "ModelAF2" 
     dbsput(testa_obj) 
     0/1 # also tried this raise datastore_errors.TransactionFailedError('The transaction could not be committed. Please try again.') 
     testb_obj = ModelTestB() 
     testb_obj.field1 = "ModelBF1" 
     testb_obj.field2 = "ModelBF2" 
     dbsput(testb_obj) 
    except Exception as e: 
     logging.info(e) 

class TransactionTesting(webapp2.RequestHandler): 
    def get(self): 
     put_entity() 

Есть идеи?

+1

Как вы пришли к выводу, что транзакции ограничены только одной моделью? –

+0

На основе документации он будет единым для модели. https://cloud.google.com/appengine/docs/python/datastore/transactions –

+1

В этом документе ничего не говорится о том, что вы ограничены одной моделью. В примерах используется только одна модель, поэтому они понятны. –

ответ

1

Сделки - это модель (вид) агностик, не ограничиваясь одной моделью.

Сделки только заботятся о группах сущностей.

  • Если все сущности находятся в одной группе лиц, вы ограничены «Максимальным размером для транзакции» (в настоящее время 10 MiB).
  • Если объекты находятся в нескольких группах сущностей, есть дополнительный предел «Максимальное количество групп сущностей, которые могут быть доступны в транзакции» (в настоящее время 25)

Транзактная обозначения в ОПРС требует, чтобы за исключением того, что он был поднят из функции, чтобы отменить транзакцию. В вашем коде предложения try ... except проглатывают исключение, что приводит к тому, что NDB считает транзакцию нормальной.