Функции Azure с EF Core DbContext — как работает область DI? ⇐ C#
-
Anonymous
Функции Azure с EF Core DbContext — как работает область DI?
Сейчас я работаю над приложением-функцией Azure в .NET Core и пытаюсь добавить транзакции для запросов. Проблема в том, что когда вызов функции выполняет работу между вызовом context.Database.BeginTransaction(...) и вызовом transaction.CommitAsync(...), тогда другой вызов функции не сможет сохраниться в базе данных и получит таймаут:
[2024-01-04T07:23:29.957Z] Исключение произошло в базе данных при сохранении изменений для типа контекста «MyContext». [2024-01-04T07:23:29.957Z] System.InvalidOperationException: возникло исключение, которое, вероятно, связано с временным сбоем. [2024-01-04T07:23:29.957Z] ---> Microsoft.EntityFrameworkCore.DbUpdateException: произошла ошибка при сохранении изменений сущности. Подробности смотрите во внутреннем исключении. [2024-01-04T07:23:29.958Z] ---> Npgsql.NpgsqlException (0x80004005): Исключение при чтении из потока [2024-01-04T07:23:29.958Z] ---> System.TimeoutException: тайм-аут во время попытки чтения Этот другой вызов функции может прекрасно сохраняться, если заранее не вызывается «длительный» вызов функции. Поэтому я предполагаю, что открытая транзакция блокирует DbContext в других вызовах функций.
Наш DbContext регистрируется следующим образом:
builder.Services.AddDbContext( опции => опции .UseNpgsql(dbConnStr) .UseSnakeCaseNamingConvention()); Насколько я понимаю, каждый вызов функции должен иметь собственную область внедрения зависимостей, как в ASP .NET Core, где «одна и та же» настройка работает без проблем.
Я что-то упустил?
РЕДАКТИРОВАТЬ: Я нашел человека с такой же проблемой, скрытой в старой проблеме Github: https://github.com/Azure/azure-function ... uecomment- 896712016, но решения с решением, похоже, не последовало.
РЕДАКТИРОВАНИЕ 2:
Основное описание двух функций:
публичный класс LongerRunningFunctionClass { [Функция("LongerRunningFunction")] public static HttpResponseData LongerRunningFunction([HttpTrigger(AuthorizationLevel.Anonymous, "get", "post")] HttpRequestData req, FunctionContext ExecutionContext) { дождитесь использования транзакции var = ожидайте _dbContext.Database.BeginTransactionAsync(); пытаться { // Представьте себе, что здесь есть какой-то код, вставляющий данные в базу данных // и выполняем вызовы внешних сервисов дождаться транзакции.CommitAsync(); } поймать (Исключение) { дождаться транзакции.RollbackAsync(); бросать; } } } общественный класс OtherFunctionClass { [Функция("ДругаяФункция")] public static HttpResponseData OtherFunction([HttpTrigger(AuthorizationLevel.Anonymous, "get", "post")] HttpRequestData req, FunctionContext ExecutionContext) { дождитесь использования транзакции var = ожидайте _dbContext.Database.BeginTransactionAsync(); пытаться { // Представьте себе быструю вставку здесь дождаться транзакции.CommitAsync(); } catch (Exception) { //
Сейчас я работаю над приложением-функцией Azure в .NET Core и пытаюсь добавить транзакции для запросов. Проблема в том, что когда вызов функции выполняет работу между вызовом context.Database.BeginTransaction(...) и вызовом transaction.CommitAsync(...), тогда другой вызов функции не сможет сохраниться в базе данных и получит таймаут:
[2024-01-04T07:23:29.957Z] Исключение произошло в базе данных при сохранении изменений для типа контекста «MyContext». [2024-01-04T07:23:29.957Z] System.InvalidOperationException: возникло исключение, которое, вероятно, связано с временным сбоем. [2024-01-04T07:23:29.957Z] ---> Microsoft.EntityFrameworkCore.DbUpdateException: произошла ошибка при сохранении изменений сущности. Подробности смотрите во внутреннем исключении. [2024-01-04T07:23:29.958Z] ---> Npgsql.NpgsqlException (0x80004005): Исключение при чтении из потока [2024-01-04T07:23:29.958Z] ---> System.TimeoutException: тайм-аут во время попытки чтения Этот другой вызов функции может прекрасно сохраняться, если заранее не вызывается «длительный» вызов функции. Поэтому я предполагаю, что открытая транзакция блокирует DbContext в других вызовах функций.
Наш DbContext регистрируется следующим образом:
builder.Services.AddDbContext( опции => опции .UseNpgsql(dbConnStr) .UseSnakeCaseNamingConvention()); Насколько я понимаю, каждый вызов функции должен иметь собственную область внедрения зависимостей, как в ASP .NET Core, где «одна и та же» настройка работает без проблем.
Я что-то упустил?
РЕДАКТИРОВАТЬ: Я нашел человека с такой же проблемой, скрытой в старой проблеме Github: https://github.com/Azure/azure-function ... uecomment- 896712016, но решения с решением, похоже, не последовало.
РЕДАКТИРОВАНИЕ 2:
Основное описание двух функций:
публичный класс LongerRunningFunctionClass { [Функция("LongerRunningFunction")] public static HttpResponseData LongerRunningFunction([HttpTrigger(AuthorizationLevel.Anonymous, "get", "post")] HttpRequestData req, FunctionContext ExecutionContext) { дождитесь использования транзакции var = ожидайте _dbContext.Database.BeginTransactionAsync(); пытаться { // Представьте себе, что здесь есть какой-то код, вставляющий данные в базу данных // и выполняем вызовы внешних сервисов дождаться транзакции.CommitAsync(); } поймать (Исключение) { дождаться транзакции.RollbackAsync(); бросать; } } } общественный класс OtherFunctionClass { [Функция("ДругаяФункция")] public static HttpResponseData OtherFunction([HttpTrigger(AuthorizationLevel.Anonymous, "get", "post")] HttpRequestData req, FunctionContext ExecutionContext) { дождитесь использования транзакции var = ожидайте _dbContext.Database.BeginTransactionAsync(); пытаться { // Представьте себе быструю вставку здесь дождаться транзакции.CommitAsync(); } catch (Exception) { //
Мобильная версия