[英]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發出此請求,他將復活。
使此問題進一步復雜化的是,其他更新在所有請求中都可以順利通過。 例如,某些玩家無需投票即可殺死其他玩家。 這種殺死使用了完全相同的Player
, getPlayerByID()
, doKill()
和updatePlayer()
,並且受害者的死亡仍然存在。
我目前正在本地主機上的Tomcat v7.0服務器上運行此程序。
固定! 原來,我后來遍歷並更新了過時的玩家列表。 因此,被殺死的玩家意外地復活了。
故事的寓意:請確保您的域對象始終是最新的!!!
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.