【问题标题】:Spring MongoDB Inconsistent Persistence IssueSpring MongoDB 不一致的持久性问题
【发布时间】:2013-10-09 14:57:21
【问题描述】:

我正在使用 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 服务器上运行它。

【问题讨论】:

  • 有兴趣的也可以直接看源码:link.

标签: java spring mongodb


【解决方案1】:

已修复!结果我后来迭代并更新了一个过时的玩家列表。所以被杀的玩家意外复活了。

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

【讨论】:

    猜你喜欢
    • 2013-01-03
    • 1970-01-01
    • 2013-07-10
    • 1970-01-01
    • 1970-01-01
    • 2014-01-08
    • 1970-01-01
    • 2016-04-27
    • 2011-11-30
    相关资源
    最近更新 更多