与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 :(得分: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
变体更快,更有效。