對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)
只有一個事務可以發生在一個時間是不是會阻止不同的(隨機)分片將同時更新計數器? 如果是這樣,什麼是分片計數器的目的,如果只有一個分片計數器可以在同一時間進行更新?
謝謝!
當事務失敗時,它會在失敗前嘗試重試幾次(我認爲是5),在這種情況下,最終會成功挑選未鎖定的碎片。 –
錯誤:在GAE上的交易不做鎖定:他們用樂觀併發控制,這意味着當事務被提交它檢查內部版本字段,如果沒有改變(=在同一時間別人改變的值),它拋出一個異常:HTTPS:/ /developers.google.com/appengine/docs/java/datastore/transactions#What_Can_Be_Done_In_a_Transaction –
Python API中,通過db.run_in_transaction,將嘗試3次。 – Greg