0

我想知道我的情况是否是一致性问题...

我有一个实体类 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 时间、可能需要再次尝试的额外查询)。

4

0 回答 0