我有webapp2服务,其中在多个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()
有什么想法吗?
答案 0 :(得分:1)
交易是模型(种类)不可知的,因此不限于单一模型。
交易只关心实体组。
NDB中的事务表示法要求您让函数中的except被引出以回滚事务。在您的代码中,try ... except
子句正在吞噬异常,这导致NDB认为事务正常完成。