ロックメカニズムを使用して、2つの並列呼び出しが同じ行を更新して予期しない動作を引き起こしていないことを確認しています。だから私のコードは次のようなものです:(実際の例はありません)Httpロック解除を待つときのステータスコードが長くかかるのはなぜですか?
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秒後にもロックが残っている場合は、「後でもう一度試してください。他の誰かがそのユーザーのデータを保存しています」という発呼者に伝えたいと思います。
そのためのREST-APIで最高のHTTPコードは何でしょうか? 409 Conflict
?または423 Locked
?
注:これはSQL-DBではありません。私は実際の取引はありません。だから自分のロック機構を実装する必要があります。
これを解決するためのより良い方法は、etagsとIf-Matchを使用することです。 – Evert
@Evertサーバーは 'If-Match'を安全に評価するにはまだロックを取得する必要があります。だから、まだタイムアウトする可能性があります。しかし、私はPUT + 'If-Match'が" AddReputation "と呼ばれるものの良いアイデアかもしれないことに同意します。 –
ビットOTですが、while(!GetLockForUser(id)){'はよりクリーンで(より安全な)コードになると思います。また、ロックはしばらくしてから有効期限が切れますか?私は解放機構を見ない。 'GetLockForUser(id)'はブロックされていますか?私はまた、1000msが遅すぎると感じています。 – DaSourcerer