我有一个托管在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时会引发异常。这些捕捉都没有。
很难获得被剥离的代码来复制问题,我在Web api中具有相同的代码,并通过使用邮递员来触发它,因为没有例外,所以它可以工作。但是在Azure中,一旦有多个实例在运行,异常就会一直发生。
例外是可以的,但我只是不知道如何处理它们。预先感谢。