我有一个健康变量,当玩家受损或愈合时,它需要增加或减少健康。
默认解决方案是执行查找,减去或添加健康然后设置。但这不是原子的,并且在查找和设置之间可能会出现损坏或治愈的请求,从而导致错误值。
因此,要以原子方式执行此操作,使用inc运算符进行查找和更新/修改可能会有效,除非您不能损坏负片或愈合最大值。所以我需要一种约束增量的方法。可能吗?
我想到的唯一其他解决方案是使用推拉操作器将阵列中的愈合和损坏排队,但我担心阵列快速增长会产生性能问题,我需要不断聚合以获得当前健康。
答案 0 :(得分:0)
您可以尝试使用Update If Current模式来解决并发问题。
http://docs.mongodb.org/manual/tutorial/update-if-current/
基本上您正在进行更新调用,但是要应用更新的文档的查询包括您要更新的旧值。如下所示:
function damagePlayer(username, done) {
var player = db.players.findOne( { username: username } );
if ( player ) {
var oldHealth = myDocument.health;
var health = oldHealth - 1;
if(health < 0) {
health = 0;
}
var results = db.products.update({
_id: player._id,
health: oldHealth
},{
$set: { health: health }
});
if ( results.hasWriteError() ) {
// This probably means that the health was updated while we were
// fetching the data to update. Just need to run this process
// again to re-apply the update.
return process.nextTick(damagePlayer.bind(this, username, done));
}
done();
}
}