交易中的分面计数器

doo*_*man 1 google-app-engine transactions sharding google-cloud-datastore

从Sharding Counters上的这个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)
Run Code Online (Sandbox Code Playgroud)

一次只能进行一次交易并且不会阻止同时更新不同(随机)分片计数器吗?如果是这样,如果一次只能更新一个分片计数器,分片计数器的目的是什么?

谢谢!

dra*_*onx 5

事务锁定涉及事务的所有实体.只要不触及相同的实体,您就可以进行多个事务.

每个分片都是一个单独的实体.这允许您同时更新各种分片.

如果事务碰巧尝试命中已经在事务中的分片(由于随机数生成器),则事务将失败.