java - 如果实体的祖先不存在,是否会创建它(Java API)?

标签 java google-app-engine google-cloud-datastore

我正在尝试设计我的应用程序引擎数据存储区代码,并想到了一个潜在的问题,但无法在文档中找到有关给定情况下会发生什么的任何具体信息。

当我去存储一个具有祖先的实体时,在存储它之前,我会检查以确保其祖先存在于一个事务中,如果不存在,我会创建祖先。接下来,我启动另一个事务,在其中存储实体,并使用在上一步中找到或创建的祖先 key 创建它。在对单个用户或极少数用户进行测试时,这永远不会成为问题,因为并发修改的机会是最低的,但是一旦部署,我担心的是,在第一个事务(创建/检索祖先)和第二个事务(添加实体作为祖先的后代)之间的时间里,另一个用户可能会删除祖先。

我最初的想法是让这一切作为一个事务发生,但在祖先不存在且必须创建的情况下,由于数据存储的快照隔离模型,用于检查我要创建的实体是否存在的祖先查询将失败。但是,我不确定这是否正确。

有谁了解这方面的情况吗?如果祖先被删除,实体提交是否仍然可以使用现在不引用任何内容的父键?这是否会重新创建父级,以便将来对其进行检查将返回相同的 key ?我会测试这种情况,但我无法设计出一种实用的方法。

最佳答案

一个可能的解决方案是尝试直接获取祖先(而不是查询),如果对象为空,则在事务中创建祖先和后代。这将模仿跨组交易(XG 交易),因为这两个实体在创建时不属于同一实体组。

有关 XG 交易的更多信息,请查看:

希望这有帮助!

关于java - 如果实体的祖先不存在,是否会创建它(Java API)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12847062/

相关文章:

google-app-engine - 为 OAuth2 提供程序正确的 AppEngine Golang 包

python - ndb.get_multi(keys) 返回 None 的数组

java - 如何实现ListIterator?

java - Hibernate:是否可以只保留一个 child ,这也会导致 parent 的坚持

java - jdo/OSGi : error building JDO PersistenceManagerFactory after bundle update

java - com.google.datastore.v1 和 com.google.cloud.datastore 之间的区别/缺少禁用索引的选项

google-app-engine - 无法使用golang从数据存储中获取基于结构值的记录

java - 使用intellij时如何在vertx中启用自动重新部署

angular - 单页应用的 AppEngine app.yaml 配置

google-app-engine - GAE 数据存储 : filter by date interval