C# 锁定http请求以进行独占资源访问
我有一个在本地sql表中查找值的服务。如果该值不存在,则它正在进行远程调用。如果有远程调用返回的值,则该值将添加到本地sql表中 我已经通知日志文件中的唯一索引异常,字符串值XXX已经存在 对我来说,这意味着发生了以下事情:C# 锁定http请求以进行独占资源访问,c#,asp.net-mvc,asp.net-web-api,C#,Asp.net Mvc,Asp.net Web Api,我有一个在本地sql表中查找值的服务。如果该值不存在,则它正在进行远程调用。如果有远程调用返回的值,则该值将添加到本地sql表中 我已经通知日志文件中的唯一索引异常,字符串值XXX已经存在 对我来说,这意味着发生了以下事情: Request1_localSqlCheck Request1_remoteCheck Request2_localSqlCheck Request2_remoteCheck Request1_AddValueLocallyIfRecievedByRemote Reques
Request1_localSqlCheck
Request1_remoteCheck
Request2_localSqlCheck
Request2_remoteCheck
Request1_AddValueLocallyIfRecievedByRemote
Request2_AddValueLocallyIfRecievedByRemote // Same value Added here causes exception.
我想让所有3个步骤都成为atom并锁定它:
Lock
{
Request1_localSqlCheck
Request1_remoteCheck
Request1_AddValueLocallyIfRecievedByRemote
}
这可以锁定这3个方法调用吗?您可以使用
互斥锁来阻止代码执行,直到服务器返回值为止
例如:
private readonly Mutex m = new Mutex();
public int ThreadSafeMethod() {
// you can do this immediately to skip the mutex
if (Request1_localSqlCheck == 1) return 1;
m.WaitOne();
try {
// check again
if (Request1_localSqlCheck == 1) return 1;
Request1_remoteCheck
Request1_AddValueLocallyIfRecievedByRemote
} finally {
m.ReleaseMutex();
}
}
需要明确的是,如果频繁调用此代码,可能会出现问题,因为它会减慢所有其他线程等待互斥锁的速度
嗯,如果“独一无二”的错误不是什么大不了的,我想你可以坚持下去;这可能会很无聊,但有时尝试失败总比等待互斥释放并放慢速度要好。锁不会跨越进程边界。如果此服务在一个服务器场或多个Worker中运行,则锁定是不够的。远程服务在clound中运行,但仅限于一个实例。我尝试/捕获了重复密钥异常,只从sql表返回了现有值。