ActiveRecord模式&竞争条件

时间:2011-11-11 20:30:29

标签: activerecord concurrency race-condition

我一直在试图解决这个问题的优雅解决方案(这似乎没有得到那么多解决)。

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

例如,如果我有一个页面给玩家点的代码如下:

$user = User::fromUsername($username);
$user->points++;
$user->save();

...和另一个减去积分的页面,如下所示:

$user = User::fromUsername($username);
$user->points -= 100;
$user->save();

如果几乎​​同时调用这两个页面会发生什么?我想如果它们以正确的顺序执行(完全按顺序执行),一切都会正常运行,但是,如果第二页在第一页运行之前从数据库中读取状态但是之后保存了怎么办?

甚至可以在ActiveRecord中解决此问题吗?什么是减轻这种情况的最佳做法(锁定无处不在?)

感谢。

1 个答案:

答案 0 :(得分:0)

我会说操作应该是原子的

http://en.wikipedia.org/wiki/Atomic_operation