我有一个.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}]");
}
}