簡體   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