繁体   English   中英

Spring MongoDB不一致的持久性问题

[英]Spring MongoDB Inconsistent Persistence Issue

我正在使用Spring和MongoDB为游戏制作Web服务。 功能之一是,每天,玩家可以投票杀死另一名玩家。 一天结束时,将计算票数,并把票数最高的玩家杀死。 这是杀死最投票的玩家的代码(在名为endDay()的更大方法中):

//mostVotes is the player's id in the database.
//Player is just a transient domain object
//playerDAO is a custom DAO that interfaces with MongoDB (see below)
Player accused = playerDAO.getPlayerByID(mostVotes);
logger.info(accused.getIsDead()); //This is false
doKill(accused);
logger.info(playerDAO.getPlayerByID(mostVotes).getIsDead()); //This is true

这是getPlayerByID():

//mongoTemplate is a MongoOperations object
public Player getPlayerByID(String id) throws NoPlayerFoundException {
    Player p = mongoTemplate.findById(id, Player.class);
    if (p == null) {
        throw new NoPlayerFoundException(id);
    }
    return p;
}

和doKill():

private void doKill(Player p) {
    p.setIsDead(true);
    playerDAO.updatePlayer(p);
}

和updatePlayer():

public void updatePlayer(Player p) {
    mongoTemplate.save(p);  
}

如您所见,当我杀死玩家之后(在endDay() )要求玩家的身份时,他似乎已经死了,这就是我们想要的。

现在,我向/player/id发出请求,其中id是玩家的ID。 这给了我返回的Player对象的JSON编码(使用与上面相同的getPlayerByID() )。 如果我用死亡玩家的ID发出此请求,他将复活。

使此问题进一步复杂化的是,其他更新在所有请求中都可以顺利通过。 例如,某些玩家无需投票即可杀死其他玩家。 这种杀死使用了完全相同的PlayergetPlayerByID()doKill()updatePlayer() ,并且受害者的死亡仍然存在。

我目前正在本地主机上的Tomcat v7.0服务器上运行此程序。

固定! 原来,我后来遍历并更新了过时的玩家列表。 因此,被杀死的玩家意外地复活了。

故事的寓意:请确保您的域对象始终是最新的!!!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM