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

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

最佳答案

你应该扪心自问:在这种情况下,客户想做什么?
从您的描述来看,似乎客户的唯一选择是等待,稍后再试。因此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)似乎不太合适:
此代码用于用户可能能够解决冲突并重新提交请求的情况。

08-04 10:38