1

摘自这篇关于分片计数器的文章,以下函数演示了如何在增加随机分片之前对其进行选择。这发生在事务中。

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)

一次只能发生一个事务,这不会阻止不同(随机)分片计数器同时更新吗?如果是这样,如果一次只能更新一个分片计数器,那么分片计数器的目的是什么?

谢谢!

4

2 回答 2

5

事务锁定事务涉及的所有实体。只要它们不涉及相同的实体,您就可以进行多笔交易。

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

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

于 2012-05-31T19:13:36.660 回答
3

不,这是独立的交易,不会相互阻塞,而且写入限制仅适用于每个实体。

基本原理:在您的情况下SimpleCounterShard,实体没有父级,这意味着每个实体都是其自己的实体组的根。事务的范围是实体组,并发写入限制也适用于实体组。

于 2012-05-31T19:16:17.453 回答