Я использую механизм блокировки, чтобы убедиться, что два параллельных вызова не обновляют ту же строку, что вызывает неожиданное поведение. Поэтому мой код выглядит примерно так: (нет примера с реальным миром)Http Statuscode при ожидании блокировки-освобождения занимает много времени?
public class UserController {
public ActionResult AddReputation(int id, int repAmount) {
int lockWait=0;
bool alreadyLocked=true;
while (alreadyLocked) {
alreadyLocked=GetLockForUser(id);
Thread.Wait(1000);
lockWait++;
if (lockWait>10) {
return new HttpStatus(xxx);
}
}
SetlockForUser(id);
AddUserRep(id,repAmount);
return new Content("Well Done");
}
}
So. Если через 10 секунд блокировка все еще существует, я хочу сообщить вызывающему абоненту «Повторите попытку позже, кто-то еще просто сохранит данные для этого пользователя».
Какой был бы лучший HTTP-код в REST-API для этого? 409 Conflict
? или 423 Locked
?
Примечание: это не SQL-DB. У меня нет реальных механизмов транзакций, которые я могу использовать. Поэтому я должен реализовать свой собственный механизм блокировки.
Более здравый способ решить эту проблему - использовать etags и If-Match. – Evert
@Evert Серверу все равно придется получить блокировку, прежде чем он сможет спокойно оценить «If-Match». Так что это все равно может закончиться. Но я согласен, что PUT + 'If-Match' может быть хорошей идеей для чего-то, называемого AddReputation. –
Немного OT, но: Я думаю 'while (! GetLockForUser (id)) {' делает для более чистого (и безопасного) кода. Также: Срок действия замков истекает через некоторое время? Я не вижу механизма выпуска. Блокировка 'GetLockForUser (id)'? Я также чувствую, что 1000 мс слишком много для задержки. – DaSourcerer