【发布时间】:2010-09-17 21:31:47
【问题描述】:
我有一个简单的域模型如下
驱动程序 - 键(字符串)、运行计数、唯一轨道计数
Track - key(string)、run-count、unique-driver-count、best-time
运行 - 键(?)、驱动键、轨道键、时间、布尔驱动更新、布尔轨道更新
我需要能够在同一事务中更新 Run 和 Driver;以及同一事务中的运行和跟踪(显然是为了确保我不会两次更新统计信息,或者错过增量计数器)
现在我已经尝试分配为运行键,一个由驱动键/轨道键/运行键(字符串)组成的键
这将让我在一个事务中更新 Run 实体和 Driver 实体。
但如果我尝试同时更新 Run 和 Track 实体,它会抱怨它不能跨多个组进行事务处理。它说它在交易中同时拥有 Driver 和 Truck 并且不能在两者上操作......
tx.begin(); 运行 = pmf.getObjectById(Run.class, runKey); track = pmf.getObjectById(Track.class, trackKey); //这是失败的地方; 增量计数器(); updateUpdatedFlags(); tx.commit();奇怪的是,当我做类似的事情来更新 Run and Driver 时,它工作正常。
关于如何映射我的域模型以实现相同功能的任何建议?
【问题讨论】:
-
我已准备好处理争用,我不需要立即更新统计字段,这就是为什么我在运行本身上有“更新”标志......因为我可以在系统运行时运行更新不那么忙...我不能牺牲的是精度...
-
作为更多的上下文,我通常会有很多赛道和很多车手;驱动程序实体不会有太多争用,它一次只能由一个用户访问,但轨道实体一次会被许多用户读取,并针对它提交运行。
-
更新——我终于完成了这个开发。结果在 tRacePerfect.com 。 “赛道”是“拼图”,“车手”是“玩家”。如您所见,维护了各种统计信息。我正在使用分片和任务技术的组合。
标签: java google-app-engine google-cloud-datastore jdo