gpt4 book ai didi

python - ndb 事务支持更新/回滚同一事务中的多个 ndb 模型条目

转载 作者:太空宇宙 更新时间:2023-11-04 05:38:25 25 4
gpt4 key购买 nike

我有 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com