Sharding Counters의 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의 트랜잭션은 잠금을 수행하지 않습니다. 즉, 트랜잭션이 커밋 될 때 내부 버전 필드를 확인하고 변경된 경우 (다른 사람이 동시에 값을 변경 한 경우) 예외를 throw하는 낙관적 동시성 제어를 사용합니다. https ://developers.google.com/appengine/docs/java/datastore/transactions#What_Can_Be_Done_In_a_Transaction –
파이썬 API는 db.run_in_transaction을 통해 3 번 시도합니다. – Greg