我使用锁机制来确保两个并行调用不会更新同一行,从而导致意外行为。所以我的代码是这样的:(没有真实的例子)
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)似乎不太合适:
此代码用于用户可能能够解决冲突并重新提交请求的情况。