Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/google-app-engine/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python ndb事务支持在同一事务中更新/回滚多个ndb模型条目_Python_Google App Engine_Transactions_Google Cloud Datastore_App Engine Ndb - Fatal编程技术网

Python 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

我有一个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以回滚事务。在您的代码中,
尝试。。。除了
条款吞并了例外情况,这导致NDB认为交易正常完成。

您是如何得出交易仅限于一个模型的结论的?根据文档,对于模型,它将是单一的。该文档中没有任何内容说明您仅限于一个模型。这些示例只使用一个模型,因此它们非常清晰。如果您不使用XG事务,则所有实体都需要位于一个实体组中。从代码中,只需引发ndb的Rollback()异常,而不是引发除零异常!这应该行得通。