2017-03-03 59 views
1

当我打电话延期交易任务从交易功能,ff而延期任务失败可以提交。应用程序引擎链接递延交易工作

但是,如果我通过电话递延叫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()失败。

回答

0

我想你是误会什么deferred.defer(y, _transactional=ndb.in_transaction())_transactional可选参数一样。这并不意味着延期y执行将发生在相同的交易中,其中deferred.defer()被调用,它只意味着排队延期任务将发生,如果交易成功。

google.appengine.ext.deferred.deferred module来自:

google.appengine.ext.deferred.deferred.defer(OBJ,*指定参数时,** kwargs)

[...]

  • obj - 可执行的可调用对象。有关限制,请参阅模块docstring。 _countdown,_eta,_headers,_name,_target, _transactional,_url,_retry_options,_queue:传递到任务队列 - 有关详细信息,请参阅任务队列文档。

而且从google.appengine.api.taskqueue.taskqueue module

加(任务,事务= FALSE)

[...]

  • 交易 - 如果True,交易工作将被添加到队列中,但不能运行或租赁到之后电子交易 成功。如果交易失败,那么任务将 被删除队列(因此​​永远不会运行)。如果False,增加的任务 都可以立即运行;任何封闭交易的成功 或失败将被忽略。

递延任务的实际执行是在一个比这里deferred.defer()被称为不同的事务上下文的其他请求完成后,总是。这就是为什么即使您的原始交易成功,您的延期任务也可能会失败。

相关问题