锁定http请求以进行独占资源访问

时间:2016-03-22 13:28:29

标签: c# asp.net-mvc asp.net-web-api

我有一个服务,它在sql表中本地查找值。如果该值不存在,则进行远程调用。如果远程调用返回了一个值,则将该值添加到本地sql表中。

我已在日志文件中通知了字符串值XXX已存在的唯一索引例外。

对我来说,这意味着发生了以下情况:

Request1_localSqlCheck
Request1_remoteCheck
Request2_localSqlCheck
Request2_remoteCheck
Request1_AddValueLocallyIfRecievedByRemote
Request2_AddValueLocallyIfRecievedByRemote // Same value Added here causes exception.

我想让所有3个步骤原子并锁定它:

Lock
{
Request1_localSqlCheck
Request1_remoteCheck
Request1_AddValueLocallyIfRecievedByRemote
}

这是否可以锁定这3个方法调用?

1 个答案:

答案 0 :(得分:0)

您可以使用Mutex来阻止代码执行,直到服务器返回值。

例如:

    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();
        }
    }

为了清楚起见,如果非常频繁地调用此代码,则可能会出现问题,因为它会减慢必须等待互斥锁的所有其他线程。

恕我直言,如果"独特"错误不是什么大问题,我认为你可以坚持下去;它可能很无聊,但有时尝试失败比等待互斥释放更慢并且减慢一切。