- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我在理解导致我的应用程序中出现错误的一系列事件时遇到了一些困难,这些错误只能在部署在 GAE 上的应用程序中间歇性出现,而在使用本地 devserver 运行时永远不会出现。 py
.
下面的所有相关代码片段(针对 MCV 进行了修剪,希望我没有丢失任何重要内容)都是在处理相同任务队列请求期间执行的。
入口点:
def job_completed_task(self, _):
# running outside transaction as query is made
if not self.all_context_jobs_completed(self.context.db_key, self):
# this will transactionally enqueue another task
self.trigger_job_mark_completed_transaction()
else:
# this is transactional
self.context.jobs_completed(self)
对应的self.context.jobs_completed(self)
是:
@ndb.transactional(xg=True)
def jobs_completed(self, job):
if self.status == QAStrings.status_done:
logging.debug('%s jobs_completed %s NOP' % (self.lid, job.job_id))
return
# some logic computing step_completed here
if step_completed:
self.status = QAStrings.status_done # includes self.db_data.put()
# this will transactionally enqueue another task
job.trigger_job_mark_completed_transaction()
self.status
setter,被黑客攻击以获得用于调试此场景的回溯:
@status.setter
def status(self, new_status):
assert ndb.in_transaction()
status = getattr(self, self.attr_status)
if status != new_status:
traceback.print_stack()
logging.info('%s status change %s -> %s' % (self.name, status, new_status))
setattr(self, self.attr_status, new_status)
job.trigger_job_mark_completed_transaction()
最终将这样的新任务排入队列:
task = taskqueue.add(queue_name=self.task_queue_name, url=url, params=params,
transactional=ndb.in_transaction(), countdown=delay)
出现的 GAE 日志,由于它不适合单个屏幕而拆分:
我对 jobs_completed
事务的期望是要么看到 ... jobs_completed ... NOP
调试消息并且没有任务排队,要么至少看到 status change running -> done
信息消息和由 job.trigger_job_mark_completed_transaction()
排队的任务。
我实际看到的是消息,没有排队的任务。
日志似乎表明事务已尝试两次:
它第一次发现状态不是done
,所以它执行逻辑,将状态设置为done
(并显示回溯和信息消息)并且应该以事务方式将新任务排入队列——但它没有
第二次它找到状态done
并只打印调试消息
我的问题是 - 如果第一次交易尝试失败,难道不应该回滚状态更改吗?我错过了什么?
最佳答案
我找到了一个解决方法:指定不重试 jobs_completed()
事务:
@ndb.transactional(xg=True, retries=0)
def jobs_completed(self, job):
这会阻止自动重复执行,而是导致异常:
TransactionFailedError(The transaction could not be committed. Please try again.)
这是可以接受的,因为我已经为整个 job_completed_task()
设置了退避/重试安全网。现在一切正常。
至于为什么回滚没有发生,我唯一想到的是在进入事务之前以某种方式读取了实体(并缓存在我的对象属性中),因此不被视为(相同的)的一部分) 交易。但我找不到可以做到这一点的代码路径,所以这只是猜测。
关于python - 失败的 ndb 事务尝试不回滚所有更改?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39919928/
如果我有一个具有以下定义的Contact 模型: class Contact(ndb.Model): name = ndb.TextProperty(indexed=False) we
我有 webapp2 服务,它在多个不相互依赖的 NDB 模型中插入条目。现在我们要求的是服务应该在事务中。那是服务失败然后它应该恢复完整的交易(例如,如果一个条目插入到第一个和第二个模型中,并且在该
切换到 python GAE 上的 ndb 库。 我可以将 ndb 与之前使用低级 api 创建的实体一起使用吗?还是我必须复制所有旧实体并重新保存它们才能使用 ndb? 谢谢! 最佳答案 ndb 只
是否可以在 pre_put_hook 中找出实体的脏因子? 我想根据put 的内容有条件地执行一些回调。例如。如果实体的特定属性发生更改,我想发送邮件通知。我可以在调用 put() 之前手动执行此操作
我是谷歌应用引擎和 NDB 的初学者。我的问题:如果我在模型中有 1 个实体, 我想防止 2 个并行操作时发生冲突,代码示例: class MyModel(ndb.Model) count = n
假设有一个看起来像这样的 ndb.Model: class Foo(ndb.Model): bar = ndb.StringProperty() 我的问题是,如果我的唯一输入是 Foo.query
给定我构造的 key ,我想访问数据存储区以查看它是否存在,但我想要最便宜(及时)的方法来做到这一点。我正在寻找的就像一个只有键的查询,但是来自 get,例如my_key.get(keys_only=
https://developers.google.com/appengine/docs/python/ndb/ https://developers.google.com/appengine/doc
我有一个 ndb.Model,它有一个 ndb.DateTimeProperty 和一个 ndb.CompulatedProperty,它使用 ndb.DateTimeProperty 创建时间戳。
我计划将 Odoo 移植到 Google App Engine Web 应用程序。当我知道 Odoo 使用 postgresql 时,是否可以将数据库连接、查询和所有从 Postgresql db 移
我有一个 POST 方法,它调用一些 tasklet。这些 tasklet 确实有 yield ,我的代码中确实有一些 x.put_async()。所以我不希望它在所有异步内容完成之前返回。所以我用
我有一个简单的 NDB 模型: from google.appengine.ext import ndb import logging from libs import Api class User(
使用 Python NDB 的新手。 我有类似的东西: class User(ndb.Model): seen_list = nbd.KeyProperty(kind=Survey, repe
我的应用程序中有以下查询 query = cls.query().filter(cls.taskgroup_id == taskgroup_id, cls.availability == True,
我在 NDB 迁移方面遇到问题。目前,我在 NDB Cluster 中有 2 个副本。我想将集群移至新硬件中。因此,在新机器中,我设置了 datanodes 和 sqlnodes 并将管理节点指向旧集
我有一个 mysql ndb 集群(详情如下)。问题是当我做最简单的事情时,例如恢复使用 mysqldump 转储的数据库,它需要绝对的时间! IE 6 小时恢复一个大小为 745MB 且在大约 30
来自 What can be done in a transaction (我的重点): All Datastore operations in a transaction must operate
我正在对 Expense 模型的方法进行单元测试。模型的相关部分如下所示: class Expense(ndb.Model): user = ndb.KeyProperty(User, req
几年来,我一直在使用类似于下面复制的代码片段。 基本思想是 Person 可以结婚,当他们结婚时,我创建一个“Marriage”实体。一个人只能结婚一次,所以我有一个 bool 值来指示这个人是否已婚
我们使用的是 ndb 数据存储、python、标准谷歌应用引擎。我们想使用查询游标。但是为了根据 here 工作和 here ,看起来我们需要实现 datastore_model.query().or
我是一名优秀的程序员,十分优秀!