Pular para o conteúdo principal

Questão de Banco de Dados — PL-SQL — FUNDATEC 2023

Banco de DadosPL-SQL
Código
qq896742
Banca
FUNDATEC
Órgão
PROCERGS
Ano
2023
Nível
Superior
Cargo
ANC - Analista em Computação - Ênfase em Desenvolvimento Oracle PL/SQL
O schedule de um conjunto de transações representa a ordem em que cada operação de cada transação é executada. Deve-se levar em consideração que, em um sistema multitarefa, as operações das transações serão intercaladas, pois a sua execução serial representaria desperdício de recursos. Considere as transações T₁ e T₂, onde w é write e r é read:T₁: r₁(X); X:= X -10; w₁(X); r₁(Y); Y:= Y + 10; w₁(Y);T₂: r₂(Y); Y := Y - 20; w₂(Y); r₂(X); X := X + 20; w₂(X);Considere o schedule para essas duas transações:Schedule: r₁(X); w₁(X); r₂(Y); w₂(Y); r₁(Y); w₁(Y); r₂(X); w₂(X);Assinale a alternativa que classifica corretamente esse schedule
  1. ACorreto e serializável.
  2. BCorreto e não serializável.
  3. CIncorreto e serializável.
  4. DIncorreto e não serializável.
  5. ECorreto e parcialmente serializável.
Revelar gabarito e comentário

GabaritoB — Correto e não serializá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”.

Serialização de Schedules em Banco de Dados

Gabarito: letra B. O schedule apresentado é correto (preserva a consistência do banco) e não serializável (não é equivalente a nenhuma execução serial das transações T₁ e T₂). A não serializabilidade fica evidente pela presença de um ciclo no grafo de precedência, indicando conflitos de leitura/escrita entre as transações nos itens X e Y.

Para classificar um schedule, dois critérios são avaliados: correção e serializabilidade. Um schedule é correto quando, ao final da execução, o banco de dados permanece em um estado consistente — ou seja, o resultado é equivalente ao de alguma execução serial das transações. Já a serializabilidade é uma propriedade mais forte: exige que o schedule seja equivalente a uma execução serial, o que é verificado por meio do grafo de precedência (também chamado de grafo de conflito). Nesse grafo, cada transação é um nó, e uma aresta de Tᵢ para Tⱼ é criada quando há um conflito entre operações de Tᵢ e Tⱼ (duas operações conflitantes são aquelas que acessam o mesmo item de dado e pelo menos uma delas é uma escrita). Se o grafo resultante contiver um ciclo, o schedule é não serializável; caso contrário, é serializável.

No schedule dado, as operações são:

  • r₁(X); w₁(X); r₂(Y); w₂(Y); r₁(Y); w₁(Y); r₂(X); w₂(X)

Vamos construir o grafo de precedência:

  1. Conflito em X: T₁ escreve X (w₁(X)) antes de T₂ ler X (r₂(X)) e escrever X (w₂(X)). Isso gera arestas T₁ → T₂ (por w₁(X) antes de r₂(X) e w₁(X) antes de w₂(X)).

  2. Conflito em Y: T₂ escreve Y (w₂(Y)) antes de T₁ ler Y (r₁(Y)) e escrever Y (w₁(Y)). Isso gera arestas T₂ → T₁ (por w₂(Y) antes de r₁(Y) e w₂(Y) antes de w₁(Y)).

Portanto, o grafo de precedência tem as arestas T₁ → T₂ e T₂ → T₁, formando um ciclo. Um schedule com ciclo no grafo de precedência não é serializável.

Apesar disso, o schedule é correto? Vamos verificar o estado final dos itens X e Y, assumindo valores iniciais, por exemplo, X = 100 e Y = 100.

  • T₁: lê X (100), subtrai 10 → X = 90, escreve X (90). Lê Y (100), soma 10 → Y = 110, escreve Y (110).

  • T₂: lê Y (110), subtrai 20 → Y = 90, escreve Y (90). Lê X (90), soma 20 → X = 110, escreve X (110).

Estado final: X = 110, Y = 90.

Agora, vamos ver os resultados das execuções seriais:

  • Serial T₁ → T₂: T₁ executa primeiro: X = 90, Y = 110. Depois T₂: lê Y (110), subtrai 20 → Y = 90; lê X (90), soma 20 → X = 110. Resultado: X = 110, Y = 90.

  • Serial T₂ → T₁: T₂ executa primeiro: lê Y (100), subtrai 20 → Y = 80; lê X (100), soma 20 → X = 120. Depois T₁: lê X (120), subtrai 10 → X = 110; lê Y (80), soma 10 → Y = 90. Resultado: X = 110, Y = 90.

Ambas as execuções seriais produzem o mesmo resultado final (X = 110, Y = 90), e o schedule intercalado também produz esse resultado. Portanto, o schedule é correto (equivalente a uma execução serial em termos de resultado final), mas não serializável (não é equivalente a nenhuma execução serial em termos de ordem de operações conflitantes).

A pegadinha da questão está em confundir correção com serializabilidade. Um schedule pode ser correto (produzir um estado consistente) sem ser serializável (não ter uma ordem serial equivalente). A serializabilidade é uma garantia mais forte, frequentemente exigida por protocolos de controle de concorrência, mas a correção é o requisito mínimo para a consistência do banco.

Serializável
Não serializável
Incorreto
Alternativa A
Alternativa B (gabarito)
Correto
Alternativa C
Alternativa D
LEVEL · soulevel.com.br

Alternativa A — ❌ Incorreta

Afirma que o schedule é correto e serializável. O schedule é correto, mas não é serializável, pois o grafo de precedência apresenta um ciclo (T₁ → T₂ e T₂ → T₁).

Alternativa B — ✅ Correta ⟵ GABARITO

O schedule é correto (produz um estado final consistente, equivalente ao resultado de uma execução serial) e não serializável (não é equivalente a nenhuma execução serial, devido ao ciclo no grafo de precedência).

Alternativa C — ❌ Incorreta

Afirma que o schedule é incorreto e serializável. O schedule é correto, pois o estado final é consistente, e não serializável, devido ao ciclo no grafo de precedência.

Alternativa D — ❌ Incorreta

Afirma que o schedule é incorreto e não serializável. O schedule é correto, pois o estado final é consistente, embora não seja serializável.

Alternativa E — ❌ Incorreta

Afirma que o schedule é correto e parcialmente serializável. O conceito de "parcialmente serializável" não é uma classificação padrão em teoria de banco de dados; um schedule ou é serializável ou não é. Como o grafo de precedência tem ciclo, ele é não serializável.

NÃO CAIA NESSA!

A banca explora a confusão entre correção e serializabilidade. Muitos candidatos, ao verem que o resultado final é consistente, concluem que o schedule é serializável. No entanto, a serializabilidade exige equivalência a uma execução serial em termos de ordem de operações conflitantes, o que não ocorre aqui devido ao ciclo no grafo de precedência. Lembre-se: um schedule pode ser correto sem ser serializável.

PEGA ESSA DICA!

Para verificar a serializabilidade, construa o grafo de precedência: crie uma aresta de Tᵢ para Tⱼ sempre que houver um conflito (duas operações no mesmo item, com pelo menos uma escrita) e Tᵢ executar antes de Tⱼ. Se o grafo tiver um ciclo, o schedule é não serializável. Para verificar a correção, compare o estado final com o resultado de alguma execução serial — se forem iguais, o schedule é correto.

Gabarito: letra B.

Link permanente: /questoes/qq896742