GAE交易:传递实体或密钥?

时间:2015-07-03 20:33:56

标签: python google-app-engine transactions google-cloud-datastore app-engine-ndb

与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])

还是取决于其他因素?

2 个答案:

答案 0 :(得分:5)

AFAIK#2不起作用(事务性地),您需要在事务中加载(并放置)对象。

答案 1 :(得分:2)

第二个例子没有产生预期的结果。在事务之外检索实体,因此任何一个实体在写回之前可能已经更改,并且可能会被错误的值覆盖。

这个特例也是使用tasklets的好例子。

money

这比使用序列中的@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() get或其put变体更快,更有效。