2

使用GAE進行交易時,可以傳遞實體或者通過密鑰傳遞給實體。例如,假設我將資金從一個實體轉移到另一個實體。我應該這樣做:GAE交易:通過實體或密鑰?

@ndb.transactional(xg=True) 
def transfer_money(key1, key2, amount): 
    entity1 = key1.get() 
    entity2 = key2.get() 
    entity1.money -= amount 
    entity2.money += amount 
    ndb.put_multi([entity1, entity2]) 

,或者這是確定:

@ndb.transactional(xg=True) 
def transfer_money(entity1, entity2, amount): 
    entity1.money -= amount 
    entity2.money += amount 
    ndb.put_multi([entity1, entity2]) 

或者它取決於其他因素?

+0

實體可以達到一個完整的兆,所以在某一點上,它可能變得簡單,容易,只是通過一個鍵 – Patrice

回答

2

第二個示例不會產生所需的結果。這些實體在事務之外被檢索,因此money可能在它被寫回之前已經改變,並且可能被錯誤的值覆蓋。

這個特殊情況也是使用tasklets的一個很好的例子。

@ndb.transactional_tasklet(xg=True) 
def transfer_money(key1, key2, amount): 
    entity1, entity2 = yield key1.get_async(), key2.get_async() # parallel 
    entity1.money -= amount 
    entity2.money += amount 
    yield entity1.put_async(), entity2.put_async() # parallel 

transfer_money(key1, key2, amount).check_success() 

這比使用串行getput,或它們的變種multi更快,更高效。

+0

謝謝,很好的答案。我一直有意學習有關tasklets的知識。 –

5

AFAIK#2不起作用(事務性),您需要在事務中加載(並放置)對象。