Questão de Banco de Dados — Transações (Locks, ACID, etc.) — FGV 2024
Banco de Dados›Transações (Locks, ACID, etc.)
Código
fg165216
Banca
FGV
Órgão
TJ AP
Ano
2024
Cargo
AJ ( )
No contexto de transações em banco de dados, a transação T1 está inserindo um novo registro na tabela TB_JUIZ. Enquanto isso, a transação T2 está lendo todos os registros de TB_JUIZ para gerar uma listagem.
Considere que:
- T1 iniciou antes de T2;
- T1 ainda não concluiu; e
- T2 não enxerga o registro que está sendo inserido por T1.
A situação apresentada acima representa um:
Abloqueio por inanição;
Bbloqueio do tipo Latches;
Cconflito causado por um registro fantasma;
Dconflito lógico entre T1 e T2, com bloqueio do item (registro) que está sendo inserido por T1;
Edeadlock que pode ser prevenido pelo esquema esperar-morrer (wait-die).
Revelar gabarito e comentário▾
GabaritoC — conflito causado por um registro fantasma;
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”.
Conflito de Concorrência: Registro Fantasma (Phantom Read)
Gabarito: letra C. A situação descreve o clássico conflito de registro fantasma (phantom read): T1 insere um novo registro enquanto T2 lê o conjunto de registros da tabela, e T2 não enxerga o registro inserido por T1 — exatamente o cenário em que uma transação lê um conjunto de linhas que é alterado por outra transação concorrente, criando a anomalia conhecida como phantom read.
O registro fantasma é uma das anomalias de concorrência mais cobradas em bancos de dados. Ele ocorre quando uma transação T2 executa uma consulta que retorna um conjunto de linhas (por exemplo, SELECT * FROM TB_JUIZ), e, enquanto essa consulta está em andamento, outra transação T1 insere (ou exclui) uma linha que satisfaz a condição da consulta de T2. O resultado é que T2, se repetir a consulta, obtém um conjunto de linhas diferente — como se um registro "fantasma" tivesse aparecido ou desaparecido. No caso do enunciado, T1 está inserindo um novo registro em TB_JUIZ, e T2, que lê todos os registros para gerar uma listagem, não enxerga esse registro. Isso é a essência do conflito de registro fantasma.
Para entender por que as outras alternativas estão incorretas, é preciso distinguir os conceitos:
Bloqueio por inanição (starvation): ocorre quando uma transação espera indefinidamente por um recurso que nunca é liberado, geralmente porque outras transações continuamente obtêm o recurso antes dela. Não há relação com a leitura de um conjunto de registros.
Latches: são mecanismos de sincronização de baixo nível usados pelo SGBD para proteger estruturas internas (como páginas de memória ou índices), não para controlar a concorrência entre transações de usuários.
Deadlock: é um impasse em que duas ou mais transações esperam por recursos que estão retidos umas pelas outras, e nenhuma pode prosseguir. O esquema wait-die (esperar-morrer) é uma técnica de prevenção de deadlock, mas não se aplica ao cenário descrito, pois não há espera circular.
Conflito lógico com bloqueio do item: embora T1 possa estar bloqueando o registro que insere, o problema central não é o bloqueio em si, mas o fato de T2 não enxergar um registro que foi inserido por outra transação — o que caracteriza a anomalia de leitura fantasma.
A pegadinha da banca está em confundir o registro fantasma com outras anomalias de concorrência, como o deadlock ou o bloqueio por inanição. O candidato que não domina os tipos de anomalias de leitura (leitura suja, leitura não repetível, leitura fantasma) pode facilmente marcar uma alternativa incorreta. A chave é identificar que o problema envolve uma inserção que não é visível para outra transação que lê um conjunto de registros.
NÃO CAIA NESSA!
A banca explora a confusão entre registro fantasma e deadlock. O candidato vê duas transações concorrentes e pensa em impasse, mas não há espera circular — T2 simplesmente não enxerga o registro inserido por T1. A palavra-chave é "não enxerga o registro que está sendo inserido": isso é a anomalia de leitura fantasma, não um deadlock.
Anomalias de concorrência
1Leitura suja (dirty read)
Lê dado não commitado
2Leitura não repetível
Lê dado alterado por UPDATE
3Leitura fantasma (phantom read)
Lê conjunto alterado por INSERT/DELETE
T2 não enxerga registro inserido por T1
LEVEL · soulevel.com.br
Alternativa A — ❌ Incorreta
Bloqueio por inanição (starvation) ocorre quando uma transação espera indefinidamente por um recurso que nunca é liberado, geralmente porque outras transações continuamente obtêm o recurso antes dela. No cenário, T2 não está esperando por um recurso — ela está lendo os registros e simplesmente não vê o registro inserido por T1. Não há espera, muito menos espera indefinida.
Alternativa B — ❌ Incorreta
Latches são mecanismos de sincronização de baixo nível usados pelo SGBD para proteger estruturas internas, como páginas de memória, buffers ou índices. Eles são de curta duração e não são usados para controlar a concorrência entre transações de usuários. A situação descrita envolve concorrência entre transações, não proteção de estruturas internas.
Alternativa C — ✅ Correta ⟵ GABARITO
O registro fantasma (phantom read) é a anomalia em que uma transação lê um conjunto de linhas que é alterado por outra transação concorrente, por meio de inserção ou exclusão. No caso, T1 insere um novo registro em TB_JUIZ, e T2, que lê todos os registros, não enxerga esse registro. Isso é exatamente o conflito de registro fantasma: T2 vê um conjunto de registros que não inclui o registro inserido por T1, como se ele fosse um "fantasma" que aparece ou desaparece.
Alternativa D — ❌ Incorreta
Embora T1 possa estar bloqueando o registro que insere, o problema central não é o bloqueio do item, mas o fato de T2 não enxergar um registro que foi inserido por outra transação. A descrição do conflito lógico com bloqueio do item não captura a essência da anomalia, que é a leitura de um conjunto de registros que é alterado por outra transação. O bloqueio do registro inserido é um mecanismo de controle, mas a situação descrita é a anomalia de leitura fantasma.
Alternativa E — ❌ Incorreta
Deadlock é um impasse em que duas ou mais transações esperam por recursos que estão retidos umas pelas outras, e nenhuma pode prosseguir. O esquema wait-die (esperar-morrer) é uma técnica de prevenção de deadlock, mas não se aplica ao cenário descrito, pois não há espera circular. T2 não está esperando por um recurso retido por T1; ela está lendo os registros e simplesmente não vê o registro inserido.
Gabarito: letra C — a situação representa um conflito causado por um registro fantasma, pois T2 não enxerga o registro inserido por T1 enquanto lê o conjunto de registros da tabela.