Questão de Banco de Dados — Geral — INSTITUTO AOCP 2026
Banco de Dados›Geral
Código
qa434751
Banca
INSTITUTO AOCP
Órgão
IF CE
Ano
2026
Cargo
Ana ( )
O IFCE mantém um banco de dados PostgreSQL que suporta o sistema de gestão acadêmica. Durante um período de alta demanda (semana de matrícula), o analista de TI responsável pelo banco de dados recebeu reclamações de lentidão no sistema. Ao investigar com as views de diagnóstico do PostgreSQL, observou as seguintes situações: múltiplas sessões no estado 'idle in transaction' com duração superior a 30 minutos; uma consulta de relatório complexo com varredura sequencial (Seq Scan) em tabela de grande volume estava bloqueando transações que aguardavam locks por mais de 10 minutos; e o parâmetro idle_in_transaction_session_timeout estava com valor 0 (desabilitado). Qual conjunto de ações é mais adequado para diagnosticar, resolver o problema imediato e prevenir recorrência?
AReiniciar o serviço PostgreSQL para encerrar forçadamente todas as conexões ativas e liberar os locks acumulados, registrar a ocorrência no log de operações e comunicar a indisponibilidade programada aos usuários do sistema, pois o reinício é o meio mais rápido e confiável de recuperar o banco em situações de bloqueio generalizado.
BUsar pg_stat_activity e pg_locks para identificar as transações bloqueantes, encerrar sessões ociosas com pg_terminate_backend(), otimizar a consulta problemática com EXPLAIN ANALYZE criando índices ou reescrevendo a query, e configurar idle_in_transaction_session_timeout para encerrar automaticamente transações ociosas.
CCriar um banco de dados vazio, exportar os dados com pg_dump, importar com pg_restore e redirecionar a aplicação para o novo banco, pois a degradação durante alta demanda com Seq Scans e locks prolongados indica que o banco de dados atual acumulou fragmentação e precisa ser reconstruído.
DAumentar max_connections no postgresql.conf, reiniciar o serviço para aplicar a configuração e monitorar via pg_stat_activity se o número de sessões idle in transaction se reduz, pois mais conexões disponíveis permitem que as transações em fila obtenham recursos e concluam normalmente.
EConfigurar o parâmetro lock_timeout para um valor reduzido (ex.: 5000ms) no postgresql.conf e reiniciar o serviço, pois isso fará com que transações que aguardem um lock por mais de 5 segundos sejam encerradas automaticamente, liberando os recursos bloqueados para as demais sessões.
Revelar gabarito e comentário▾
GabaritoB — Usar pg_stat_activity e pg_locks para identificar as transações bloqueantes, encerrar sessões ociosas com pg_terminate_backend(), otimizar a consulta problemática com EXPLAIN ANALYZE criando índices ou reescrevendo a query, e configurar idle_in_transaction_session_timeout para encerrar automaticamente transações ociosas.
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”.
PostgreSQL: diagnóstico e resolução de bloqueios e transações ociosas
Gabarito: letra B. A alternativa correta combina as três frentes de atuação: diagnosticar com pg_stat_activity e pg_locks, resolver o problema imediato encerrando sessões ociosas com pg_terminate_backend() e otimizando a consulta problemática com EXPLAIN ANALYZE, e prevenir recorrência configurando idle_in_transaction_session_timeout. Essa é a abordagem cirúrgica e definitiva para o cenário descrito, em que múltiplas sessões 'idle in transaction' e uma consulta com Seq Scan bloqueiam transações por locks.
O problema apresentado é um clássico de administração de bancos de dados PostgreSQL: transações ociosas (sessões que abriram uma transação, executaram comandos e ficaram paradas sem COMMIT ou ROLLBACK) e consultas lentas que seguram locks por muito tempo. Vamos entender cada peça do cenário antes de julgar as alternativas.
O que são sessões 'idle in transaction'? Quando uma aplicação inicia uma transação (BEGIN) e executa comandos, mas não a finaliza, a sessão fica no estado idle in transaction. Essas sessões seguram todos os locks adquiridos durante a transação, impedindo que outras transações acessem os mesmos dados. Com o parâmetro idle_in_transaction_session_timeout desabilitado (valor 0), o PostgreSQL não encerra automaticamente essas sessões, permitindo que elas se acumulem e causem degradação generalizada.
O que é uma varredura sequencial (Seq Scan)? É quando o PostgreSQL lê a tabela inteira para encontrar as linhas que atendem à consulta, em vez de usar um índice. Em tabelas de grande volume, isso é extremamente lento e pode segurar locks por muito tempo, bloqueando outras transações. O EXPLAIN ANALYZE mostra o plano de execução da consulta, revelando onde está o gargalo (por exemplo, a Seq Scan) e permitindo otimizações como a criação de índices ou a reescrita da query.
Como resolver o problema imediato? O pg_terminate_backend() encerra uma sessão específica, liberando os locks que ela segura. É uma ação cirúrgica, que deve ser usada com cuidado, mas é a forma correta de lidar com sessões ociosas que estão bloqueando o sistema. Reiniciar o serviço (alternativa A) é uma medida drástica que derruba todas as conexões, causando indisponibilidade e perda de trabalho em andamento, e não resolve a causa raiz.
Como prevenir recorrência? Configurar idle_in_transaction_session_timeout para um valor adequado (por exemplo, 30 segundos ou 1 minuto) faz com que o PostgreSQL encerre automaticamente transações ociosas após o tempo limite, evitando que elas se acumulem. Essa é a medida preventiva correta, pois ataca a causa raiz do problema.
A alternativa B é a única que aborda as três frentes de forma completa e correta: diagnóstico, resolução imediata e prevenção. As demais alternativas ou são medidas drásticas desnecessárias (A), ou não resolvem o problema real (C, D), ou configuram um parâmetro que não é o mais adequado (E).
1Diagnosticar (pg_stat_activity, pg_locks)
2Encerrar sessões ociosas (pg_terminate_backend)
3Otimizar consulta (EXPLAIN ANALYZE, índices)
4Prevenir (idle_in_transaction_session_timeout)
LEVEL · soulevel.com.br
Alternativa A — ❌ Incorreta
Reiniciar o serviço PostgreSQL é uma medida drástica que derruba todas as conexões, causando indisponibilidade e perda de trabalho em andamento. Além disso, não resolve a causa raiz: as sessões ociosas e a consulta lenta continuarão existindo após o reinício. O correto é encerrar seletivamente as sessões problemáticas com pg_terminate_backend(), não reiniciar o serviço.
Alternativa B — ✅ Correta ⟵ GABARITO
Esta alternativa descreve exatamente o procedimento correto: usar pg_stat_activity e pg_locks para identificar as transações bloqueantes, encerrar sessões ociosas com pg_terminate_backend(), otimizar a consulta problemática com EXPLAIN ANALYZE (criando índices ou reescrevendo a query) e configurar idle_in_transaction_session_timeout para encerrar automaticamente transações ociosas. Essa abordagem resolve o problema imediato e previne recorrência.
Alternativa C — ❌ Incorreta
Criar um banco de dados vazio, exportar com pg_dump e importar com pg_restore é um procedimento de migração ou recuperação de desastres, não uma solução para bloqueios e transações ociosas. A fragmentação não é a causa do problema descrito; a causa são sessões ociosas e consultas lentas. Essa alternativa é desnecessariamente complexa e não resolve o problema real.
Alternativa D — ❌ Incorreta
Aumentar max_connections não resolve o problema de transações ociosas e locks. Pelo contrário, pode piorar a situação, permitindo que mais sessões ociosas se acumulem. O problema não é falta de conexões, mas sim sessões que seguram locks por muito tempo. A solução é encerrar as sessões ociosas e otimizar as consultas, não aumentar o número de conexões.
Alternativa E — ❌ Incorreta
Configurar lock_timeout para 5000ms faria com que transações que aguardam um lock por mais de 5 segundos fossem encerradas, mas isso é uma medida paliativa que pode causar erros em transações legítimas que precisam esperar por locks. O parâmetro mais adequado para o problema descrito é idle_in_transaction_session_timeout, que encerra transações ociosas, não transações que estão aguardando locks. Além disso, a alternativa sugere reiniciar o serviço, o que é desnecessário.
NÃO CAIA NESSA!
A banca tenta confundir o candidato com medidas drásticas (reiniciar o serviço) ou com parâmetros que não atacam a causa raiz (aumentar max_connections, configurar lock_timeout). O candidato que não conhece as views de diagnóstico e as funções de gerenciamento de sessões do PostgreSQL pode cair na alternativa A, que parece "rápida e confiável", mas na verdade causa indisponibilidade e não resolve o problema. Lembre-se: a abordagem correta é sempre diagnosticar, resolver cirurgicamente e prevenir.
PEGA ESSA DICA!
Para questões de administração de PostgreSQL, memorize as principais views e funções: pg_stat_activity (mostra sessões ativas), pg_locks (mostra locks), pg_terminate_backend() (encerra sessão), EXPLAIN ANALYZE (analisa plano de execução) e idle_in_transaction_session_timeout (encerra transações ociosas). Essas são as ferramentas essenciais para diagnosticar e resolver problemas de concorrência e bloqueio.