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