Взято из this artice на шариковых счетчиках, следующая функция демонстрирует, как случайный осколок выбран до его приращения. Это происходит в транзакции.Оверенные счетчики в пределах транзакции
def increment():
"""Increment the value for a given sharded counter."""
def txn():
index = random.randint(0, NUM_SHARDS - 1)
shard_name = "shard" + str(index)
counter = SimpleCounterShard.get_by_key_name(shard_name)
if counter is None:
counter = SimpleCounterShard(key_name=shard_name)
counter.count += 1
counter.put()
db.run_in_transaction(txn)
Может только одна сделка состоится в то время, и было бы, что не мешает различных (случайных) sharded счетчики обновляться одновременно? Если да, то какова цель подсчетных счетчиков, если только один подсвеченный счетчик может обновляться за раз?
Спасибо!
Когда транзакция завершается с ошибкой, она пытается повторить попытку несколько раз (я думаю, 5), прежде чем провалиться навсегда, что в этом случае в конечном итоге удастся получить неблокированный осколок. –
Неправильно: транзакции на GAE не блокируют: они используют оптимистичный контроль параллелизма, а это означает, что при совершении транзакции он проверяет внутреннее поле для проверки версий, а если изменено (= кто-то другой изменил значения в одно и то же время), он выдает исключение: https://developers.google.com/appengine/docs/java/datastore/transactions#What_Can_Be_Done_In_a_Transaction –
Питон api через db.run_in_transaction попробует 3 раза. – Greg