锁定 http 请求以获得独占资源访问



我有一个服务,它在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 个方法调用吗?

您可以使用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();
        }
    }

需要明确的是,如果非常频繁地调用此代码,则可能会有问题,因为它会减慢必须等待互斥锁的所有其他线程的速度。

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

最新更新