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队列:传递到任务队列-有关详细信息,请参阅任务队列文档
和来自:

添加(任务,事务=False)

[……]

  • 事务性–如果
    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()
的事务上下文中完成。这就是为什么即使原始事务成功,延迟的任务也可能失败