我正在使用 JDO 访问 Datastore 实体。我目前遇到问题,因为不同的进程并行访问相同的实体,我不确定如何解决这个问题。
我有包含值和计算值的实体:(key,value1,value2,value3,计算)
计算发生在单独的任务队列中。用户可以随时编辑这些值。如果更新了这些值,则会将一个新任务推送到覆盖旧计算值的队列中。
我目前遇到的问题是在以下情况下:
- 用户创建实体
- 任务开始
- 用户在其初始条目中发现错误并快速更新实体
- 任务基于旧数据(来自步骤 1)完成并覆盖整个实体,同时删除新输入的值(来自步骤 3)
- 用户不高兴
所以我的问题:
- 我可以在步骤 4 中使任务在更新时失败吗?由于最终的一致性,将任务包装在事务中似乎并不能解决所有情况下的这个问题(或者,很可能,我对数据存储事务的理解是错误的)
- 使用低级 setProperty 方法是更新实体的单个字段的唯一方法,这会解决我的问题吗?
- 如果以上都不是,那么处理这样的用例的最佳方法是什么
背景:
目前,我不介意为了一致性而交易表现。我以后会关心性能。
这是我的第一个 AppEngine 应用程序,因为它是一个学习过程,它没有使用一些最佳实践。我很清楚,事后看来,我应该对我的数据模式进行更长时间和更努力的思考。例如,我的所有实体都没有在合适的地方使用祖先关系。我来自关系背景,这表明。
我正在计划进行一次重大的重构,可能会转向 Objectify,但与此同时,我有一些紧迫的问题需要尽快解决。我想首先完全了解数据存储区。