0

我正在创建和编辑组。我需要检查在创建具有该名称的新组之前是否已经使用组名,或者将现有组名称更改为该名称。appengine上的线程安全名称保留

的问题是两个并行的线程可以既为组名在同一时间检查,然后每一个线程可以继续,并添加自己的组。重复的名字!

我不认为我可以使用内置的事务,因为这些群体应该在不同的实体组和名称不是关键的一部分。我能做什么?

难道意义做出那种在关键使用组名称指数的实体,这样我可以做一个祖先查询来获取和创建原子的名字?创建索引实体的成功将作为非事务代码执行的权限。我希望有一个更简单的解决方案,不需要一个全新的实体类型。

回答

1

的“指数单位”象你所说的是一个标准的方法来这一点,虽然我不知道你的意思使用祖先查询什么 - 索引实体既不应该是任何其他实体的孩子,也没有任何儿童。

请记住这样的交易影响:意外故障可能会导致被保留,但不使用名称。

0

您可以使用Memcache解决方案而不是新实体吗?你可能不得不定期清除它。

0

是否没有办法将组名(或基于名称的散列)用作关键字?因为+ group.get_or_insert(group_name)基本上可以解决你的问题。该方法自动在事务中运行,并使用该key_name创建或检索实体。

+0

我使用'长'ID来引用客户端的实体,这是非常根深蒂固的。当然,切换是一种选择,并且可能比我的索引实体解决方案更容易(并且更具有缺陷)。谢谢你的提示。 – 2011-03-12 13:21:03

+0

@Riley'hashlib.sha256('my group name').hexdigest()'or'hashlib.sha256('my group name')。digest()。encode('base64')'会给你散列,可能是用作键,并且可以在客户端使用(尽管它们会使你的URL变得更加糟糕)。 – Calvin 2011-03-12 16:49:57

+0

更好:'base64.urlsafe_b64encode(hashlib.sha256('my group name')。digest())。rstrip('=')' – Calvin 2011-03-12 17:06:39

0

你们真的认为事务可以作为线程锁吗?号

此外,为了避免并行计算的环境下的竞争条件最好的办法是,虽然,为了避免冲突的写入。也就是说,修改你的结构,延迟并将组名写入到一个单独的线程中。是的,它并不是实时的,但我怀疑你是否真的需要一个实时组名。请记住,如果你想要的不仅仅是一个玩具系统,还可以在任何地方使用不同步和拥抱不一致。