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

时间:2016-01-18 14:41:33

标签: python google-app-engine transactions google-cloud-datastore app-engine-ndb

我有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()

有什么想法吗?

1 个答案:

答案 0 :(得分:1)

交易是模型(种类)不可知的,因此不限于单一模型。

交易只关心实体组。

  • 如果所有实体都在单个实体组中,则受“交易的最大大小”(目前为10 MiB)的限制。
  • 如果实体位于多个实体组中,则存在“可在事务中访问的最大实体组数”(目前为25个)的附加限制

NDB中的事务表示法要求您让函数中的except被引出以回滚事务。在您的代码中,try ... except子句正在吞噬异常,这导致NDB认为事务正常完成。