Python ndb事务支持在同一事务中更新/回滚多个ndb模型条目
我有一个webapp2服务,其中在多个NDB模型中插入不相互依赖的条目。 现在我们需要的是服务应该在事务中。如果服务中出现故障,则应恢复完整事务 (例如,如果在第一个和第二个模型中插入的条目在该事务失败后,则应删除在第一个模型中插入的记录。) 我研究了ndb事务,但它似乎没有什么用处,因为它一次只适用于一个模型。我还研究了跨组事务,但这不是我的数据结构所必需的 比如说 模型结构Python ndb事务支持在同一事务中更新/回滚多个ndb模型条目,python,google-app-engine,transactions,google-cloud-datastore,app-engine-ndb,Python,Google App Engine,Transactions,Google Cloud Datastore,App Engine Ndb,我有一个webapp2服务,其中在多个NDB模型中插入不相互依赖的条目。 现在我们需要的是服务应该在事务中。如果服务中出现故障,则应恢复完整事务 (例如,如果在第一个和第二个模型中插入的条目在该事务失败后,则应删除在第一个模型中插入的记录。) 我研究了ndb事务,但它似乎没有什么用处,因为它一次只适用于一个模型。我还研究了跨组事务,但这不是我的数据结构所必需的 比如说 模型结构 class ModelTestA(ndb.Model): field1 = ndb.StringPropert
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()
有什么想法吗?事务是模型(种类)不可知的,因此不限于单个模型
事务只关心实体组
- 如果所有实体都在一个实体组中,则受“事务的最大大小”(当前为10 MiB)的限制李>
- 如果实体位于多个实体组中,则有一个额外的限制“在一个事务中可以访问的实体组的最大数量”(目前为25个)
NDB中的事务表示法要求您让函数抛出except以回滚事务。在您的代码中,
尝试。。。除了
条款吞并了例外情况,这导致NDB认为交易正常完成。您是如何得出交易仅限于一个模型的结论的?根据文档,对于模型,它将是单一的。该文档中没有任何内容说明您仅限于一个模型。这些示例只使用一个模型,因此它们非常清晰。如果您不使用XG事务,则所有实体都需要位于一个实体组中。从代码中,只需引发ndb的Rollback()异常,而不是引发除零异常!这应该行得通。