Pular para o conteúdo principal

Questão de Banco de Dados — Transações (Locks, ACID, etc.) — FGV 2024

Banco de DadosTransaçõ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:

  1. Abloqueio por inanição;
  2. Bbloqueio do tipo Latches;
  3. Cconflito causado por um registro fantasma;
  4. Dconflito lógico entre T1 e T2, com bloqueio do item (registro) que está sendo inserido por T1;
  5. 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.

Link permanente: /questoes/fg165216