等待锁定释放时的Http Statuscode需要很长时间吗?

时间:2016-05-09 12:40:22

标签: http http-status-codes

我正在使用锁机制来确保两个并行调用不会更新同一行,从而导致意外行为。所以我的代码是这样的:(没有现实世界的例子)

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");
    }
  }

因此。如果在10秒之后锁定仍然存在,我想告诉呼叫者"请稍后再试,其他人只是为该用户保存数据"。

REST-API中最好的HTTP代码是什么? 409 Conflict?还是423 Locked

注意:这不是SQL-DB。我没有真正可以使用的事务机制。所以我必须实现自己的锁定机制。

1 个答案:

答案 0 :(得分:3)

您应该问问自己:客户在这种情况下想做什么?

根据您的描述,听起来客户的唯一选择是等待并稍后再试。所以503 (Service Unavailable)似乎很合适:

  

表示由于临时过载或计划维护,服务器当前无法处理请求,这可能会在延迟一段时间后得到缓解

此外,通用500 (Internal Server Error)随时为您服务。

423(已锁定)可能适合也可能不适合。它被设计为WebDAV’s locking mechanisms的一部分,客户端明确锁定和解锁资源。通常,客户端更容易理解503错误(在野外非常常见)而不是423错误(在WebDAV之外不常见):423很可能被视为通用client error,这可能没有帮助。也就是说,the definition of 423 itself不要求涉及WebDAV锁定。如果你想区分这种情况,比如服务器停机时间(这会导致503),那么423可能会有效。

409 (Conflict) 似乎非常合适:

  

此代码用于用户可能能够解决冲突并重新提交请求的情况。