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() 

Это быстрее и эффективнее, чем использование get или put в сериале, или их multi варианты.

+0

Спасибо, отличный ответ. Я хотел узнать о талиях. –

5

AFAIK # 2 не работает (транзакционно), вам нужно загрузить (и поместить) объекты внутри транзакции.

 Смежные вопросы

  • Нет связанных вопросов^_^