2017-03-03 52 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()被稱爲不同的事務上下文的其他請求完成後,總是。這就是爲什麼即使您的原始交易成功,您的延期任務也可能會失敗。

相關問題