Шаблон ActiveRecord и условия гонки - PullRequest
0 голосов
/ 12 ноября 2011

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

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

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

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

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

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

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

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

Спасибо.

1 Ответ

0 голосов
/ 12 ноября 2011

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

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

...