我正在尝试设计我的应用程序引擎数据存储区代码,并想到了一个潜在的问题,但无法在文档中找到有关给定情况下会发生什么的任何具体信息。
当我去存储一个具有祖先的实体时,在存储它之前,我会检查以确保其祖先存在于一个事务中,如果不存在,我会创建祖先。接下来,我启动另一个事务,在其中存储实体,并使用在上一步中找到或创建的祖先 key 创建它。在对单个用户或极少数用户进行测试时,这永远不会成为问题,因为并发修改的机会是最低的,但是一旦部署,我担心的是,在第一个事务(创建/检索祖先)和第二个事务(添加实体作为祖先的后代)之间的时间里,另一个用户可能会删除祖先。
我最初的想法是让这一切作为一个事务发生,但在祖先不存在且必须创建的情况下,由于数据存储的快照隔离模型,用于检查我要创建的实体是否存在的祖先查询将失败。但是,我不确定这是否正确。
有谁了解这方面的情况吗?如果祖先被删除,实体提交是否仍然可以使用现在不引用任何内容的父键?这是否会重新创建父级,以便将来对其进行检查将返回相同的 key ?我会测试这种情况,但我无法设计出一种实用的方法。
最佳答案
一个可能的解决方案是尝试直接获取祖先(而不是查询),如果对象为空,则在事务中创建祖先和后代。这将模仿跨组交易(XG 交易),因为这两个实体在创建时不属于同一实体组。
有关 XG 交易的更多信息,请查看:
希望这有帮助!
关于java - 如果实体的祖先不存在,是否会创建它(Java API)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12847062/