У меня есть вызов API ядра .net, который принимает объект, проверяет базу данных, чтобы увидеть, существует ли он, а затем сохраняет его в базе данных (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}]");
}
}