我有 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()
有什么想法吗?
最佳答案
交易与模型(种类)无关,因此不限于单一模型。
事务只关心实体组。
- 如果所有实体都在一个实体组中,您将受到“交易的最大大小”(当前为 10 MiB)的限制。
- 如果实体在多个实体组中,还有一个额外的限制“一个事务中可以访问的实体组的最大数量”(目前为 25 个)
NDB 中的事务符号要求您从函数中引发 except 以使其回滚事务。在您的代码中,try ... except
子句吞没了异常,这导致 NDB 认为交易正常完成。
关于python - ndb 事务支持更新/回滚同一事务中的多个 ndb 模型条目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34857369/