2012-05-22 4 views
0

Мне нужно обновить счетчик и вернуть текущий счетчик. Я следую примеру здесь: https://developers.google.com/appengine/articles/sharding_countersтранзакционный счетчик в GAE

Но я не уверен, что вы можете косвенно выполнять транзакционный запрос через функцию. Вот пример кода:

@db.transactional 
def updateCounter(name): 
    increment(name) 
    get_count(name) 

updateCounter(TOTAL_USERS) 

Будет ли это возвращать текущее количество приращений? или этот подход недействителен, поскольку запрос базы данных находится вне функции @ db.transactional?

ответ

3

Невозможно *, чтобы получить счет транзакции счетчика. Способ работы с закрытыми счетчиками состоит в том, что вы можете обновлять их в транзакции и суммировать их вне транзакции. Как правило, это не проблема, потому что подсвеченные счетчики используются там, где счетчик обновляется много раз в секунду; любая транзакционная запись счетчика была бы неправильной практически в тот момент, когда она была рассчитана.

* Вы могли сделать это до 5 осколков путем использования XG сделок, но это действительно плохая идея. Во-первых, из-за причин, указанных выше, и во-вторых, потому что он будет налагать те же самые проблемы масштабируемости, которые вы пытаетесь избежать, используя в первую очередь заштрихованные счетчики.

+0

Спасибо, Ник. Это было очень полезно. – Andrew

0

Вы можете only use ancestor queries по сделке.

С get_count() использует запрос, не относящийся к его предку, его код приведет к ошибке.

+0

что касается XG сделка? – dragonx

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