【问题标题】:Http Statuscode when waiting for lock-release takes to long?等待锁定释放时的 Http Statuscode 需要很长时间?
【发布时间】:2016-05-09 22:26:29
【问题描述】:

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

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。我没有真正可以使用的交易机制。所以我必须实现自己的锁定机制。

【问题讨论】:

  • 解决这个问题的更明智的方法是使用 etags 和 If-Match。
  • @Evert 服务器在安全评估If-Match 之前仍然需要获得锁。所以它仍然可能超时。但我同意 PUT + If-Match 可能是一个名为“AddReputation”的好主意。
  • 有点过时,但是:我认为while(!GetLockForUser(id)) { 使代码更清晰(更安全)。另外:锁会在一段时间后过期吗?我看不到释放机制。 GetLockForUser(id) 阻塞了吗?我也觉得 1000 毫秒对于延迟来说太过分了。
  • @DaSourcerer 这只是一个简单的例子。没有真实世界的代码
  • 嗯,它引起了我的注意ヽ(´ー`)┌

标签: http http-status-codes


【解决方案1】:

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

根据您的描述,听起来客户唯一的选择就是等待,稍后再试。所以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)不看起来很合适:

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

【讨论】:

  • 我对 423 不太确定,因为它与 WebDAV 的锁定机制非常相关:恕我直言,它并不太适合通用锁定实现。但503确实是绝配。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-11-10
  • 1970-01-01
  • 2013-11-12
  • 2018-11-10
  • 1970-01-01
相关资源
最近更新 更多