Шаблон ActiveRecord и условия гонки

Я немного почесал голову над элегантным решением для решения этой проблемы (которая, похоже, не так много решалась).

Мне нравится гибкость шаблона Active Record, но, похоже, он очень чувствителен к условиям гонки, поскольку у вас может быть сотня независимых «авторитетных» копий состояния одновременно (с достаточно загруженным веб-приложением).

Например, что, если у меня есть страница, которая дает игрокам очки с таким кодом:

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

... и еще одна страница, которая вычитает баллы, например:

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

Что произойдет, если обе эти страницы будут вызваны почти одновременно? Я предполагаю, что если они будут выполняться в правильном порядке (полностью последовательно), все будет работать нормально, однако что, если вторая страница считывает состояние из базы данных до запуска первой, но сохраняет потом?

Возможно ли вообще решить эту проблему в ActiveRecord? Каковы наилучшие методы для смягчения этого (замки везде?)

Спасибо.


person Jonathan Chan    schedule 11.11.2011    source источник


Ответы (1)


Я бы сказал, что операции должны быть атомарными

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

person Simon Bergot    schedule 11.11.2011
comment
Да, это то, о чем я спрашиваю - как лучше всего убедиться, что действия над объектами ActiveRecord являются атомарными... - person Jonathan Chan; 12.11.2011
comment
ну, я не уверен, что голосование против - это правильный способ поблагодарить меня за словарь для вашей проблемы. В любом случае, вы говорите, что проблема не решена, но такие фреймворки, как Redis, управляют очередью транзакций, чтобы сделать их атомарными. jimneath.org/2011/03/24/ использование-redis-с-ruby-on-rails.html - person Simon Bergot; 14.11.2011
comment
Прошу прощения за минус - не знаю, о чем я там думал. К сожалению, сейчас нельзя вернуть. Я думаю, что я должен уточнить формулировку вопроса, и спасибо, что указали на это. Я постараюсь сделать это завтра. - person Jonathan Chan; 15.11.2011