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

标签 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()

有什么想法吗?

最佳答案

交易与模型(种类)无关,因此不限于单一模型。

事务只关心实体组。

  • 如果所有实体都在一个实体组中,您将受到“交易的最大大小”(当前为 10 MiB)的限制。
  • 如果实体在多个实体组中,还有一个额外的限制“一个事务中可以访问的实体组的最大数量”(目前为 25 个)

NDB 中的事务符号要求您从函数中引发 except 以使其回滚事务。在您的代码中,try ... except 子句吞没了异常,这导致 NDB 认为交易正常完成。

关于python - ndb 事务支持更新/回滚同一事务中的多个 ndb 模型条目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34857369/

相关文章:

Python 脚本(Reddit 机器人)重置 http 错误/超时变量

python - 尝试从 lambda(python)访问 S3 时出错

google-app-engine - 在谷歌应用程序引擎上创建复合或复合键

java - 在 GAE 上使用 Siena 时如何编写单元测试

java - 如何解释 Objectify save() 中的返回值

java - @Transactional 注释不代理我的类

python - 高效生成斯特恩双原子序列

python - 将数字添加到子图

java - Spring 交易: rollback on Exception or Throwable

.net - MongoDB事务?