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

Ole*_*ers 2 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");
    }
  }
Run Code Online (Sandbox Code Playgroud)

所以。如果10秒后锁仍然存在,我想告诉调用者“请稍后再试,其他人只是在为该用户保存数据”。

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

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

Vas*_*nov 6

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

\n

从您的描述来看,听起来 client\xe2\x80\x99s 唯一的选择是等待并稍后重试。所以503(服务不可用)似乎很合适:

\n
\n

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

\n
\n

此外,通用500(内部服务器错误)始终为您服务。

\n

423(锁定)可能适合也可能不适合。它被设计为WebDAV\xe2\x80\x99s 锁定机制的一部分,其中客户端显式锁定和解锁资源。一般来说,与 423 错误(在 WebDAV 之外不常见)相比,客户端更有可能理解 503 错误(在野外非常常见):423 可能被视为通用客户端错误,这可能没有帮助。也就是说,423 本身的定义并不要求涉及 WebDAV 锁定。如果您想将这种情况与服务器停机(这会导致 503)之类的情况区分开来,那么 423 可能会起作用。

\n

409(冲突)似乎不太合适:

\n
\n

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

\n
\n