1

我是Google CloudDatastore的新手,正在阅读文档。
(注:我们不打算使用谷歌的AppEngine,只是数据存储只)Google Cloud Datastore - 是否可以为单个根实体使用事务?

按照document,数据存储区支持事务,但

If you want to use queries within a transaction, 
your data must be organized into entity groups in such a way 
that you can specify ancestor filters that will match the right data. 

所以我想,只要我想用事务,我不得不创建一些父键,并将其设置为祖先。父母的所有实体都有限制,即更新和事务只能每秒执行一次。

但是,我也看到插入的一个很简单的例子,在这里: https://cloud.google.com/datastore/docs/concepts/entities#datastore-insert-python

with client.transaction(): 
    incomplete_key = client.key('Task') 

    task = datastore.Entity(key=incomplete_key) 

    task.update({ 
     'category': 'Personal', 
     'done': False, 
     'priority': 4, 
     'description': 'Learn Cloud Datastore' 
    }) 

    client.put(task) 

它没有指定父,并使用一个事务中一个根实体,不是吗?甚至关于Transaction page中的示例,只有“只读事务”的示例明确指定了父级。其他人在实际存在的情况下是否忽略父母?

我想知道我可以使用事务没有实体组(=没有大的性能下降),如果我可以指定一个根实体的关键,但在文件中没有这样的描述......

如果有人能够澄清这一行为,我将不胜感激。谢谢。

回答

1

交易确实允许(25个实体组per documentation的限制)

如果你想在交易中使用的查询,

注意在这个关键句你引用的文字。它表示你想在事务内发出的任何'查询'都需要作为祖先查询。这是因为非祖先查询最终是一致的,所以事务引擎不可能推断任何状态变化,因此不知道何时失败或成功完成事务。这是而不是说你不能跨实体组进行交易。

它没有指定父项并在 事务中使用单个根实体,是吗?

我认为这是混淆的另一个来源。只有子实体指定了父母来表示它们在哪个实体组中。当没有指定父实体时,则的实体是根实体(它的父实体是根)。另一种说法是每个根实体都是它自己的实体组。

+0

这样做是否合法? --- (0)通过密钥查找某个根实体并检查其'版本'属性 (1)开始一个事务 (2)再次查找实体并检查'版本'。 (3-a)如果'version'与(0)相同,则更新该值并继续执行 (3-b),否则其他进程触及该实体,则跳过该作业。 (4)提交事务--- 基本上我想要实现的一种乐观锁单个实体可以同时处理一些任务,在这种情况下想知道如果我还是要准备一些类型的祖先给每一个实体以执行上述交易。 –

+1

完全有效。作为参考,我们的交易本身使用乐观锁定。如果你只是在读写,你不必担心整个祖先的事情。它只考虑你是否在做SELECT/RunQuery。 –

+0

好的,谢谢你的信息!这听起来可以将我们现有的MongoDB堆栈迁移到完全托管的DataStore。我感谢你的快速回应:) –

0

从技术上讲,您的描述中的任务实体即使没有子实体也构成实体组。允许的最大实体组数量为25,因此如果尝试使用此模式创建超过25个顶级实体,则查询将失败。

我避免性能命中的方式是使用多个实体组。我构建数据存储库,以便拥有多个根实体,并尝试限制实体组中的多个事务。在多个实体组

+0

我有后台工作人员,并希望确保一名工作人员处理工作时,没有其他人冗余处理同一工作。因此,如果我在DataStore中存储了作业信息,那么我只想在一个处理过程中锁定作业实体。 我想我可以使用事务来达到这个目的(如果所有进程都试图更新事务中的某个锁定属性,那么只有第一个会成功)。但我认为我可以将每项工作存储为根实体,但在阅读完文档后,我担心如果需要构建每个实体的父级(合理分配),就像您一样。 –

相关问题