我想知道我的情况是否是一致性问题...
我有一个实体类 Player,它有一个字段 lastAttackDate。我在事务中设置 lastAttackDate = sysdate,然后提交该事务,然后查询 lastAttackDate < sysdate - 10min 的玩家(请参阅简化代码)。
private static final Logger log = Logger.getLogger(MyEndpoint.class.getName());
@ApiMethod(name = "attack")
public MyResult attack(@Named("id") Long id, User user) throws Exception, OAuthRequestException, IOException {
PersistenceManager mgr = null;
Player defender = null;
Transaction tx = null;
try {
mgr = getPersistenceManager();
tx = mgr.currentTransaction();
tx.begin();
long now = new Date().getTime();
defender = getPlayer(mgr, id);//I get player by param ID
defender.setLastAttackDate(now);
tx.commit(); //mgr.close(); mgr = getPersistenceManager();--> I tried that, it did not help
long param = now - 10*60*1000;//sysdate - 10 minutes
Query q = pm.newQuery("select from " + Player.class.getName() +" where lastAttackDate < lastAttackDateParam parameters long lastAttackDateParam");
Set<Player> result = new HashSet<Player>();
result.addAll((List<Player>) q.execute(param));
Iterator<Player> it = results.iterator();
while(it.hasNext())
{
Player p = it.next();
if (p.getLastAttackDate() >= param)
{
log.log(Level.SEVERE, "It really just gave me a result that doesn't meet the criteria");//defender (the recently updated player) falls in this category
it.remove();
}
}
}
finally {
if (tx != null && tx.isActive())
tx.rollback();
if (mgr != null)
mgr.close();
return null;
}
}
令我困扰的是,这个查询结果仍然给了我防守者。更困扰我的是,如果我遍历结果并检查它是否符合标准,我可以看到它不符合标准。如果是一致性问题,我怀疑 getLastAttackDate() 应该返回旧的,而不是更新的值,但它给出了正确的值,即最新的值。我做错了什么?我该怎么做才能让它发挥作用?
目前,我遍历结果集并删除不符合我的搜索条件的条目,但这很昂贵(读取、cpu 时间、可能需要再次尝试的额外查询)。