У меня есть служба, размещенная в Azure, которая будет работать в нескольких экземплярах одновременно, все это - асинхронные вызовы.В глубине цепочки есть метод для сохранения данных в базе данных.У меня есть код для обработки исключения, когда несколько экземпляров пытаются записать одни и те же данные в базу данных, но исключение никогда не перехватывается.
Служба, размещенная на Azure
public async Task Start(CancellationToken cancellationToken = default)
{
// Do something ....
await processedInventoryRepository.Commit(invenotyData).ConfigureAwait(false);
}
Репозиторий, сохраняющий данные в базе данных
public class Repository
{
public async Task Commit(InventoryData data)
{
try
{
await SaveHardware(data.Hardware).ConfigureAwait(false); ;
await SaveProduct(data.Product).ConfigureAwait(false); ;
await SaveInstall(data.Installs).ConfigureAwait(false); ;
}
// Exception handle not handled here
catch (DbUpdateException ex)
{
var innerException = (SqlException)ex.InnerException;
if (innerException != null && (innerException.Number == 2627 || innerException.Number == 2601))
{
// log the error;
}
}
}
private async Task SaveInstall(DbContext _context, Install installs)
{
_context.Installs.Add(installs);
await _context.SaveChangesAsync().ConfigureAwait(false);
}
private async Task SaveProduct(DbContext _context, Porduct product)
{
try
{
if (!_context.Products.Any(p => p.Id == product.Id))
{
_context.Products.Add(product);
await _context.SaveChangesAsync().ConfigureAwait(false);
}
}
// Exception not handled here
catch (DbUpdateException ex)
{
var innerException = (SqlException)ex.InnerException;
if (innerException != null && (innerException.Number == 2627 || innerException.Number == 2601))
{
// log the error
}
}
}
В сохранении данных в базе данных нет ничего особенного, но стоитОтметим, что Install имеет внешний ключ Product.
Исключение произошло в методе SaveProduct, что ожидается, поскольку несколько экземпляров стремятся добавить одни и те же поиски.Вот почему предложение catch помещено туда, чтобы проигнорировать эту ошибку и позволить продолжить выполнение._context.Produts.Add (product) в порядке, но возникает исключение при вызове SaveChanges.ни один из этих уловов не работает.
Трудно получить раздетый код, чтобы повторить проблему, у меня был тот же код в веб-API, и вызвать его с помощью почтальона, он работает, так как нет исключений.Но в Azure, когда запущено несколько экземпляров, исключения происходят постоянно.
Исключения в порядке, но я просто не могу понять, как с ними справиться.Заранее спасибо.