【发布时间】:2015-07-14 09:30:30
【问题描述】:
我正在开发一个通过 JSON API 连接到 Google Cloud Datastore 的 Google AppEngine 应用程序(我正在使用 PHP)。
我正在阅读 Google 提供的所有文档,但仍有疑问:
在有关 Transactions 的文档中,有以下提及:“事务必须在属于有限数量 (5) 个实体组的实体上运行”(顺便说一下,几行之后我们可以找到:“所有事务中的数据存储操作最多可在 25 个实体组上运行”)。 我不确定什么是实体组。假设我有一个对象 Country,它仅由其种类 (COUNTRY) 和数据存储区的自动受影响的密钥 ID 标识。所以没有祖先路径,层次关系等......所有国家实体都只计入1个实体组吗?还是每个国家都数一数?
对于 Country 实体类型,我需要一个增量唯一 ID(如 SQL AUTOINCREMENT)。它必须是绝对独特且没有间隙的。此外,这种对象的创建时间不会超过几/分钟,因此无需处理争用和分片。我正在考虑有一个独特的计数器来反映自动增量并在事务中使用它。以下代码模式可以吗?:
Starting transaction, getting the counter, commit the creation of the Country along with the update of the counter. Rollback the transaction if the commit fails.这种模式是否可以防止 2 个相同 id 的影响?您能否向我确认,如果 2 个进程同时获取计数器(因此值相同),第一个提交的进程将使另一个进程失败(因此它将能够重新启动并获取新的计数器值)?documentation 还提到:“如果您的应用程序在尝试提交事务时收到异常,并不一定意味着事务失败。即使在事务已提交,最终将成功应用”!?我们应该如何处理这种情况?如果在创建我的国家时出现这种行为(问题 #2),我的自动增量 ID 会出现问题,不是吗!?
因为数据存储需要一个事务的所有写入操作仅在一次调用中完成。而且既然事务保证了事务的全部或不执行,为什么还要回滚呢?
1 次写入 / 秒的限制仅适用于实体(因此由其种类及其关键路径定义)而不是整个实体组(只有当我确定什么时我才会放心确切地说是一个实体组;-) 问题 #1)
我在这里停下来不是为了发表一篇大文章。在得到这些问题的答案后,我可能会回复其他(或改进的)问题;-)
感谢您的帮助。
[UPDATE] Country 仅用作示例类对象。
【问题讨论】:
-
这不是一个问题,这里至少有五个问题。请分别询问。
-
它们都是关于交易的,有些与其他有关。反正我会做的
-
为什么要一个国家的增量ID?为什么不使用 country slug 作为 ID?使用计数器自动递增的东西..你做错了。
-
感谢您的回答德米特里。我应该准确地说,Country 只是一个示例类,我可以说 Foo。
-
@BrentWashburne 好的,现在我同意了,我应该拆分每个问题... ;-)
标签: google-app-engine transactions google-cloud-datastore