ActiveRecord模式&;竟态条件

ActiveRecord模式&;竟态条件,activerecord,concurrency,race-condition,Activerecord,Concurrency,Race Condition,我一直在绞尽脑汁寻找一个优雅的解决方案来解决这个问题(这个问题似乎没有得到太多的解决) 我喜欢状态的流动性,但它似乎非常容易受到竞争条件的影响,因为您可能同时拥有100个独立的“权威”状态副本(使用足够繁忙的web应用程序) 例如,如果我有一个页面,该页面使用如下代码为玩家提供分数: $user = User::fromUsername($username); $user->points++; $user->save(); $user = User::fromUsername($u

我一直在绞尽脑汁寻找一个优雅的解决方案来解决这个问题(这个问题似乎没有得到太多的解决)

我喜欢状态的流动性,但它似乎非常容易受到竞争条件的影响,因为您可能同时拥有100个独立的“权威”状态副本(使用足够繁忙的web应用程序)

例如,如果我有一个页面,该页面使用如下代码为玩家提供分数:

$user = User::fromUsername($username);
$user->points++;
$user->save();
$user = User::fromUsername($username);
$user->points -= 100;
$user->save();
。。。另一页是减去点的,如下所示:

$user = User::fromUsername($username);
$user->points++;
$user->save();
$user = User::fromUsername($username);
$user->points -= 100;
$user->save();
如果几乎同时调用这两个页面,会发生什么情况?我想,如果它们按正确的顺序(完全按顺序)执行,一切都会顺利进行,但是,如果第二个页面在第一个页面运行之前从数据库读取状态,但在第一个页面运行之后保存,会怎么样

甚至可以在ActiveRecord中解决这个问题吗?缓解这种情况的最佳实践是什么(到处都是锁?)


谢谢。

我认为操作应该是原子的


是的,这正是我想问的——确保ActiveRecord对象上的操作是原子的最好方法是什么……好吧,我不确定否决票是否是感谢我为您的问题提供词汇表的正确方法。不管怎么说,你说这个问题还没有得到解决,但是像redis这样的框架管理一个事务队列,使其原子化。我为投票被否决而道歉——我不知道我当时是怎么想的。很遗憾,现在无法还原它。我认为我应该澄清问题的措辞,谢谢你指出这一点。我明天会尽量这样做。