如何处理Web服务中并行客户端调用引起的问题

时间:2014-05-24 02:39:46

标签: c# web-services concurrency asp.net-web-api

我目前正在实施一项网络服务。考虑以下伪代码(基于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调用的不太可能的时间到达如此精确的数量,这成为一个问题 - 虽然我不希望我的服务坚如磐石。

2 个答案:

答案 0 :(得分:2)

我个人会考虑使用实体框架来提交您的更改。 EF具有交易意识,可以防止这种竞争状况发生。

这是回答问题的另一篇文章。

Transactions in the Entity Framework

答案 1 :(得分:0)

对于并发性,您应该使用时间戳/日期时间,因此当用户提交更改时,您会根据修改记录的最后时间/日期时间进行验证,即使两个用户尝试同时保存,第二个保存也会获得关于他的信息的错误是旧的。