Могу ли я указать порядок изменений в одной транзакции App Engine? Равен ли он порядку списка аргументов? - PullRequest
0 голосов
/ 14 марта 2010

Если я передам список идентификаторов ключей в качестве аргумента в транзакции, произойдет ли изменение, связанное с первым ключом в списке, первым? И если нет, то как мне указать порядок, в котором я хочу, чтобы произошли изменения?

В качестве конкретного примера рассмотрим приведенный ниже код из Транзакции Документов Google - произойдут ли изменения первого элемента в acc.key () первым?

class Accumulator(db.Model):
    counter = db.IntegerProperty()

Docshttp://code.google.com/appengine/docs/python/datastore/transactions.html:
def increment_counter(key, amount):
    obj = db.get(key)
    obj.counter += amount
    obj.put()

q = db.GqlQuery("SELECT * FROM Accumulator")
acc = q.get()
db.run_in_transaction(increment_counter, acc.key(), 5)

1 Ответ

2 голосов
/ 14 марта 2010

q.get() возвращает только первый результат, поэтому в этом коде обновляется только одна сущность (или нет).

Смысл транзакции заключается в том, что все изменения в хранилище данных происходят "одновременно". Я не могу вспомнить ни одной ситуации, в которой я бы хотел бы многократных изменений в транзакции иметь заказ - наличие заказа подразумевает, что что-то видит состояние модели данных, в которой транзакция только частично завершена и цель транзакций - избежать этого.

Даже в рамках транзакции изменения не происходят последовательно, все они происходят вместе в конце. Если вы put() сущность, а затем get() ее внутри транзакции, то вы не увидите никаких изменений, только состояние хранилища данных до транзакции.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...