【发布时间】: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 这只是一个简单的例子。没有真实世界的代码
-
嗯,它引起了我的注意ヽ(´ー`)┌