Google app engine appengine上的线程安全名称保留

Google app engine appengine上的线程安全名称保留,google-app-engine,transactions,thread-safety,google-cloud-datastore,Google App Engine,Transactions,Thread Safety,Google Cloud Datastore,我正在创建和编辑组。在创建具有该名称的新组或将现有组名更改为该名称之前,我需要检查组名是否已在使用 问题是两个并行线程可以同时检查组名,然后每个线程可以继续添加自己的组。重复的名字 我不认为我可以使用内置事务,因为这些组应该在不同的实体组中,并且名称不是键的一部分。我能做什么 创建一种索引实体,在键中使用组名,这样我就可以执行祖先查询以原子方式获取和创建名称,这有意义吗?成功创建索引实体将作为执行非事务性代码的权限。我希望有一个更简单的解决方案,不需要全新类型的实体。您能使用解决方案而不是新实体

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

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

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


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

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

没有办法使用组名(或基于组名的哈希)作为密钥吗?因为+group.get\u或\u insert(group\u name)基本上可以解决您的问题。该方法在事务中自动运行,并创建或检索具有该键名称的实体。

您描述的“索引实体”是实现此目的的标准方法,尽管我不知道您使用祖先查询的意思-索引实体不应该是任何其他实体的子实体,也不应该有任何子实体


记住这样做的事务含义:意外的失败可能会导致保留但未使用的名称。

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


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

我非常喜欢使用
Long
id来引用客户端的实体。当然,切换是一种选择,而且可能比我的索引实体解决方案更容易(也更能抵御bug)。谢谢你的提示。@Riley
hashlib.sha256(“我的组名”).hexdigest()
hashlib.sha256(“我的组名”).digest().encode('base64')
将为你提供可用作键的散列,并且可以在客户端使用(尽管它们会屏蔽你的URL)。更好的是:
base64.urlsafe\u b64encode(hashlib.sha256('my group name').digest()).rstrip('=')