如何在异步方法中管理并发

时间:2019-07-02 14:35:39

标签: c# concurrency .net-core

我有一个.net核心API调用,该调用带有一个对象,检查数据库以查看其是否存在,然后将其保存到(Mongo)数据库中。

我的问题是有时这些请求来自队列,或者可能来自用户双击按钮,因此保存的版本不一定是获取的版本(因为更新不会在得到)。

我的问题是:我应该如何管理此提取,然后在异步方法中更新(如果您不能使用锁)

这是api方法

public async Task<NotificationResponse> Any(Notification request)
{
    try
    {
        //want to put a lock around these somehow.....
        ICdsDeclarationData declaration = await m_DataProvider.GetImportDeclaration(request.LocalReferenceNumber); //returns data with rowVersion number
        //do some other stuff                

        await m_DataProvider.UpsertImportDeclaration(declaration, request.LocalReferenceNumber); //save to DB
    }
    catch { /* ... */ }
}

在数据提供程序Upsert方法中,我们拥有

private void IncrementAndCheckRowVersion(IRowVersionable newPoco, IRowVersionable storedPoco, string uniqueIdentifier)
{
    newPoco.RowVersion = newPoco.RowVersion + 1;
    if (newPoco.RowVersion <= storedPoco.RowVersion)
    {
        Logger.Warn(x => x.Message($"Concurrency violation detected for [{uniqueIdentifier}] - new record rowversion: [{newPoco.RowVersion}] stored record rowversion: [{storedPoco.RowVersion}]"));
        throw new ConcurrencyException($"Row version mismatch for [{uniqueIdentifier}]");
    }
}

0 个答案:

没有答案