Questão de Banco de Dados — PL-SQL — FUNDATEC 2023
Banco de Dados›PL-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
ACorreto e serializável.
BCorreto e não serializável.
CIncorreto e serializável.
DIncorreto e não serializável.
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.
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)).
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.