如何处理web服务中由并行客户机调用引起的问题

本文关键字:调用 客户机 并行 问题 何处理 处理 服务 web | 更新日期: 2023-09-27 18:04:56

我目前正在实现一个web服务。考虑以下伪代码(基于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
}

所以现在当第二个调用进入服务器时,锁将被设置在帐户上,任何有关并发状态的问题都不会出现。

这是我唯一能解决这个问题的方法吗?我对实现它犹豫不决,因为我需要为我在web服务上的相当多的功能这样做,它引入了其他复杂性,我担心一个帐户可能最终被永久锁定。再加上API调用不太可能定时到如此精确的数量,这就成了一个问题——尽管我不希望我的服务坚如磐石。

如何处理web服务中由并行客户机调用引起的问题

我个人会考虑使用实体框架提交您的更改。EF是事务感知的,可以防止这种竞态条件的发生。

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

实体框架中的事务

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