Скажем, у вас есть действие в ASP.NET MVC в среде с несколькими экземплярами, которая выглядит примерно так: *:
public void AddLolCat(int userId)
{
var user = _Db.Users.ById(userId);
user.LolCats.Add( new LolCat() );
user.LolCatCount = user.LolCats.Count();
_Db.SaveChanges();
}
Когда пользователь несколько раз нажимает кнопку или обновляется, условия гонки будут происходить, что позволяет LolCatCount не похож на количество LolCats.
Вопрос
Каков общий способ устранения этих проблем? Вы можете исправить ее на стороне клиента в JavaScript, но это может быть не всегда возможно. То есть когда что-то происходит на странице обновления, или потому, что кто-то висит вокруг в Fiddler.
- Думаю, вам нужно сделать какой-то сетевой замок?
- Вам действительно нужно страдать дополнительной задержкой за звонок?
- Можете ли вы сказать, что действие разрешено выполнять только один раз на пользователя?
- Есть ли какой-нибудь общий шаблон, который вы можете использовать? Как фильтр или атрибут?
- Вы вернетесь рано или действительно заблокируете процесс?
- Когда вы вернетесь раньше, существует ли "установленный" ответ/ответный код, который я должен вернуть?
- Когда вы используете блокировку, как вы предотвращаете головоломку потоков с (полу) длительными процессами?
* просто тупой пример, показанный для краткости. Примеры реальных стран намного сложнее.