如何处理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调用不太可能定时到如此精确的数量,这就成了一个问题——尽管我不希望我的服务坚如磐石。
我个人会考虑使用实体框架提交您的更改。EF是事务感知的,可以防止这种竞态条件的发生。
这是另一篇回答这个问题的文章。
实体框架中的事务
对于并发性,您应该使用时间戳/日期时间,以便当用户提交更改时,您根据记录被修改的最后时间/日期时间进行验证,即使两个用户试图同时保存,第二个保存也会得到关于他的信息是旧的错误。