appengine上的Threadsafe名称保留

时间:2011-03-11 17:39:58

标签: google-app-engine transactions thread-safety google-cloud-datastore

我正在创建和编辑群组。在创建具有该名称的新组或将现有组名更改为该名称之前,我需要检查组名是否已被使用。

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

我认为我不能使用内置事务,因为这些组应该位于不同的实体组中,并且名称不是密钥的一部分。我该怎么办?

使用密钥中的组名创建一种索引实体是否有意义,以便我可以执行祖先查询来获取并以原子方式创建名称?创建索引实体的成功将用作非事务代码执行的权限。我希望有一个更简单的解决方案,不需要一个全新的实体类型。

4 个答案:

答案 0 :(得分:1)

您描述的'索引实体'是一种标准方法,但我不知道您对使用祖先查询的意思 - 索引实体既不应该是任何其他实体的子项,也不应该有任何子项

请记住执行此操作的事务影响:意外故障可能导致保留但未使用的名称。

答案 1 :(得分:0)

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

答案 2 :(得分:0)

是否无法使用组名(或基于名称的哈希)作为密钥?因为+ group.get_or_insert(group_name)基本上可以解决您的问题。该方法自动在事务中运行,并使用该key_name创建或检索实体。

答案 3 :(得分:0)

你们真的认为交易可以作为线程锁吗?没有。

此外,在并行计算环境下避免竞争条件的最佳方法是避免冲突写入。也就是说,修改你的结构,延迟并将组名写入收集到一个线程中。是的,它不是实时的,但我怀疑你是否真的需要一个实时的组名生成。请记住,如果你想要的不仅仅是一个玩具系统,那么在任何地方都要使用异步并拥抱不一致。