我目前正在实施一项网络服务。考虑以下伪代码(基于WebApi):
[HttpPost]
public UpdateUserAccount(UpdateUserAccountModel model)
{
1. Check Model is valid
a) does user account have property x
2. perform update
a) apply property x to user account
3. save changes
}
现在我知道这是一个不太可能的情况,但无论如何我觉得我应该处理它。如果两个调用并行到具有相同参数的此函数,则当第二个调用进入时,Web服务可能会执行(2a)。第二个调用也将验证通过最初的通话还没有保存更改,我最终会得到意想不到的结果。
我想到的一个解决方案是在用户帐户上实施锁定
[HttpPost]
public UpdateUserAccount(UpdateUserAccountModel model)
{
1. Check Model is valid
a) does user account have property x
2. Check account lock
a) does the users account have lock=true
b) if true, returns HTTP error response
3. Apply account lock
a) set lock=true on DB entry + save
4. perform update
a) apply property x to user account
5. save changes
6. remove account lock
a) set lock=false on DB entry + save
}
所以现在当第二个调用进入服务器时,将在帐户上设置锁定,并且不会出现关于并发状态的任何问题。
这是我解决这个问题的唯一方法吗?我对实施它犹豫不决,因为我需要对网络服务中的一些功能执行此操作,并且它引入了其他复杂性并且我担心帐户可能最终被永久锁定。结合API调用的不太可能的时间到达如此精确的数量,这成为一个问题 - 虽然我不希望我的服务坚如磐石。
答案 0 :(得分:2)
答案 1 :(得分:0)
对于并发性,您应该使用时间戳/日期时间,因此当用户提交更改时,您会根据修改记录的最后时间/日期时间进行验证,即使两个用户尝试同时保存,第二个保存也会获得关于他的信息的错误是旧的。