Analista do Ministério Público - Especialidade: Desenvolvimento de Sistemas
Diante de um módulo de um Ministério Público Estadual que grava movimentações processuais em banco relacional com picos de falhas transitórias de conexão, usando Entity Framework Core com estratégia de execução (retries) habilitada, e da necessidade de garantir atomicidade em múltiplas operações, a abordagem compatível com retries e transação é
Ausar AsNoTracking ( ) nas consultas, entendendo que reduz o rastreamento de entidades diminuiria conflitos transacionais e facilitaria a repetição das operações em caso de falha.
Bdesabilitar a estratégia de execução lenta de (retries) e manter transações manuais, assumindo que o controle explícito de BeginTransaction ( ) e Commit ( ) evita a repetição automática de comandos em caso de falha transitória.
Cexecutar o bloco transacional por meio da própria estratégia de execução (Execute/ExecuteAsync) para que o conjunto seja repetível.
Dmanter a transação manual e envolver o SaveChanges ( ) em um try/catch, repetindo seletivamente a persistência final para não duplicar comandos intermediários.
Econfigurar o DbContext como singleton e manter a transação por mais tempo, buscando reduzir reaberturas de conexão e minimizar falhas transitórias durante múltiplas operações.
Revelar gabarito e comentário▾
GabaritoC — executar o bloco transacional por meio da própria estratégia de execução (Execute/ExecuteAsync) para que o conjunto seja repetível.
Comentário gerado por IA. É um apoio ao estudo, ancorado em fontes, mas pode conter imprecisões — confira sempre na fonte oficial (lei, súmula, edital e gabarito da banca). Encontrou um erro? Use “Reportar”.
Entity Framework Core – Estratégia de execução (retries) com transações
Gabarito: letra C. No Entity Framework Core, quando uma estratégia de execução com retries está habilitada para lidar com falhas transitórias, o uso de transações manuais convencionais (BeginTransaction/Commit) não é suportado diretamente. A abordagem correta é executar todo o bloco transacional dentro do delegado da própria estratégia, utilizando os métodos Execute ou ExecuteAsync, de modo que o conjunto de operações seja repetível como uma unidade atômica.
A questão aborda um cenário real: falhas transitórias de conexão em um banco relacional. O EF Core oferece o mecanismo de Execution Strategy (ex.: SqlServerRetryingExecutionStrategy) que automaticamente retenta operações em caso de falhas temporárias. Contudo, esse mecanismo conflita com transações explícitas manuais, pois a estratégia tentaria repetir comandos que já estão dentro de uma transação aberta, gerando erros de estado. A solução documentada é encapsular a lógica transacional em um delegado passado ao método Execute/ExecuteAsync da estratégia, permitindo que todo o bloco seja reiniciado do zero em caso de falha.
Alternativa A — ❌ Incorreta
Usar AsNoTracking() reduz o rastreamento de entidades, mas não resolve a atomicidade com retries. AsNoTracking é útil para consultas apenas leitura, não para garantir que múltiplas operações sejam repetidas consistentemente em caso de falha.
Alternativa B — ❌ Incorreta
Desabilitar a estratégia de retries e manter transações manuais vai contra a necessidade do cenário, que apresenta picos de falhas transitórias. Sem retries, as falhas temporárias levariam a perda de operações ou necessidade de tratamento manual complexo.
Alternativa C — ✅ Correta ⟵ GABARITO
Executar o bloco transacional por meio da própria estratégia de execução (métodos Execute/ExecuteAsync). Essa é a prática recomendada pela documentação do EF Core: quando uma estratégia com retries está configurada, transações devem ser abertas e confirmadas dentro do delegado, permitindo que a estratégia repita todo o bloco em caso de falha transitória, garantindo atomicidade.
Alternativa D — ❌ Incorreta
Manter transação manual e envolver SaveChanges() em um try/catch para repetir seletivamente não é compatível com retries. A transação manual já foi iniciada fora do controle da estratégia, podendo causar estado inconsistente se a estratégia tentar retentar comandos.
Alternativa E — ❌ Incorreta
Configurar o DbContext como singleton é inadequado, pois DbContext não é thread-safe e não foi projetado para ser compartilhado entre múltiplas requisições. Além disso, manter a transação por mais tempo não resolve o problema de falhas transitórias e pode levar a bloqueios prolongados.
PEGA ESSA DICA!
Sempre que o EF Core estiver configurado com uma estratégia de execução (retries), evite transações manuais diretas. Em vez disso, use o padrão:
await context.Database.CreateExecutionStrategy().ExecuteAsync(async () =>
{
using var transaction = await context.Database.BeginTransactionAsync();
// operações...
await context.SaveChangesAsync();
await transaction.CommitAsync();
});
Isso garante que todo o bloco seja repetido atomicamente.