Google app engine 应用程序引擎链接延迟的事务性任务
当我从事务函数调用延迟事务任务时,Google app engine 应用程序引擎链接延迟的事务性任务,google-app-engine,app-engine-ndb,deferred,transactional,Google App Engine,App Engine Ndb,Deferred,Transactional,当我从事务函数调用延迟事务任务时,f,f可以在延迟任务失败时提交 但是,如果通过延迟调用调用f,调用函数将失败 为了重新编程,我做了以下工作: @ndb.transactional() def f(): # modify datastore entity X ... x.put() class X(ndb.Model): ... def _post_put_hook(self, future) deferred.defer(y,
f
,f
可以在延迟任务失败时提交
但是,如果通过延迟调用调用f
,调用函数将失败
为了重新编程,我做了以下工作:
@ndb.transactional()
def f():
# modify datastore entity X
...
x.put()
class X(ndb.Model):
...
def _post_put_hook(self, future)
deferred.defer(y,
_transactional=ndb.in_transaction())
def y():
raise Exception()
当我调用f
时,延迟的任务失败,但是x.put()
提交
但是,如果我调用deferred.f,
x.put()
失败。我认为您误解了deferred.deferred(y,\u transactional=ndb.in\u transaction())
中的\u transactional
可选参数的作用。这并不意味着延迟的y
执行将发生在调用了deferred.deferry()
的同一事务中,它只意味着如果事务成功,将发生延迟任务排队
发件人:
google.appengine.ext.deferred.deferred.deferred(obj,*args,**kwargs)
[……]
- obj–可调用以执行的对象。有关限制,请参阅模块docstring_倒计时,_eta,_headers,_name,_target, \u事务性,\u url,\u重试\u选项,\u队列:传递到任务队列-有关详细信息,请参阅任务队列文档
- 事务性–如果
,则事务性任务将添加到队列中,但在事务之后才能运行或租用 成功。如果事务失败,则任务将从中删除 队列(因此永远不会运行)。如果True
,则添加的任务 可立即运行;任何封闭事务的成功 或者忽略失败False
延迟任务的实际执行是在另一个请求上完成的,总是在不同于调用
deferred.deferry()
的事务上下文中完成。这就是即使原始事务成功,延迟任务也可能失败的原因。我认为您误解了deferred.deferry(y,\u transactional=ndb.in\u transaction())中的\u transactional
可选参数的作用。这并不意味着延迟的y
执行将发生在调用了deferred.deferry()
的同一事务中,它只意味着如果事务成功,将发生延迟任务排队
发件人:
google.appengine.ext.deferred.deferred.deferred(obj,*args,**kwargs)
[……]
- obj–可调用以执行的对象。有关限制,请参阅模块docstring_倒计时,_eta,_headers,_name,_target,
\u事务性,\u url,\u重试\u选项,\u队列:传递到任务队列-有关详细信息,请参阅任务队列文档
和来自:
添加(任务,事务=False)
[……]
- 事务性–如果
True
,则事务性任务将添加到队列中,但在事务之后才能运行或租用
成功。如果事务失败,则任务将从中删除
队列(因此永远不会运行)。如果False
,则添加的任务
可立即运行;任何封闭事务的成功
或者忽略失败
延迟任务的实际执行是在另一个请求上完成的,总是在不同于调用deferred.deferry()
的事务上下文中完成。这就是为什么即使原始事务成功,延迟的任务也可能失败