Questão de Banco de Dados — Transações (Locks, ACID, etc.) — CESPE / CEBRASPE 2025
- Código
- ce417348
- Banca
- CESPE / CEBRASPE
- Órgão
- PF
- Ano
- 2025
- Cargo
- PCF
- CCerto
- EErrado
GabaritoE — Errado
Gabarito: Errado. A afirmação está incorreta porque, durante a recuperação após uma falha, o sistema não se limita a aplicar apenas os registros de transações confirmadas (commit) — ele também precisa desfazer (rollback) as operações de transações que não foram confirmadas, e o checkpoint não é um marco que faz o sistema ignorar tudo o que veio depois dele. O processo de recuperação usa o log para refazer (redo) as transações confirmadas e desfazer (undo) as não confirmadas, garantindo as propriedades de atomicidade e durabilidade.
A recuperação de um banco de dados após uma falha é um processo que visa restaurar o banco a um estado consistente, refletindo apenas os efeitos das transações que foram confirmadas com sucesso. Para isso, o SGBD utiliza o log de transações, que registra todas as operações de escrita realizadas pelas transações, juntamente com informações sobre o início, o commit e o rollback de cada uma. O log é a fonte de verdade para o subsistema de recuperação, que é o responsável por garantir a atomicidade e a durabilidade das transações.
O processo de recuperação envolve duas fases principais: redo (refazer) e undo (desfazer). Na fase de redo, o sistema reaplica as operações de todas as transações que foram confirmadas (commit) mas cujas alterações ainda não foram gravadas no disco, garantindo a durabilidade. Na fase de undo, o sistema desfaz as operações de transações que não foram confirmadas (ou seja, que estavam ativas no momento da falha), garantindo a atomicidade. Portanto, a afirmação de que o sistema "aplica apenas os registros presentes no log de transações já confirmadas" está correta apenas para a fase de redo, mas ignora a fase de undo, que é igualmente essencial.
O checkpoint é um mecanismo que periodicamente grava em disco todas as alterações pendentes e registra no log um ponto de sincronização. Ele serve para reduzir o trabalho de recuperação, pois, a partir do checkpoint, o sistema sabe que todas as transações confirmadas antes dele já tiveram suas alterações persistidas. No entanto, o checkpoint não faz com que o sistema ignore as operações registradas após ele. Pelo contrário, a recuperação precisa examinar o log a partir do último checkpoint para identificar as transações que estavam ativas ou que foram confirmadas depois dele, aplicando redo ou undo conforme necessário. Ignorar as operações após o checkpoint deixaria o banco em estado inconsistente, pois transações confirmadas após o checkpoint poderiam ter suas alterações perdidas, e transações não confirmadas poderiam deixar efeitos parciais.
Um exemplo prático: suponha que uma transação T1 tenha feito um commit e uma transação T2 estivesse em andamento quando ocorreu uma falha. O log contém as operações de T1 e T2. Na recuperação, o sistema fará o redo de T1 (reaplicando suas operações) e o undo de T2 (desfazendo suas operações). Se o sistema ignorasse as operações após o último checkpoint, e T1 tivesse sido confirmada após o checkpoint, suas alterações seriam perdidas, violando a durabilidade. Da mesma forma, se T2 tivesse operações após o checkpoint, elas não seriam desfeitas, violando a atomicidade.
A pegadinha desta questão está em associar o checkpoint a um ponto de corte que elimina a necessidade de processar o log após ele. Na verdade, o checkpoint apenas delimita o ponto a partir do qual a recuperação deve começar a analisar o log, mas todas as operações registradas após ele — tanto de transações confirmadas quanto de não confirmadas — precisam ser consideradas. O sistema aplica redo para as confirmadas e undo para as não confirmadas, independentemente de estarem antes ou depois do checkpoint.
A banca tenta fazer você acreditar que o checkpoint é um "ponto de não retorno" que permite ignorar tudo o que veio depois. Na verdade, o checkpoint apenas reduz o escopo da recuperação: ele marca o início da análise do log, mas as operações posteriores a ele são exatamente as que precisam ser processadas (redo para commits, undo para transações ativas).
A afirmação está errada porque a recuperação não se limita a aplicar apenas os registros de transações confirmadas. O processo de recuperação envolve duas ações complementares:
Redo (refazer): aplica as operações de transações que fizeram commit, mas cujas alterações ainda não foram persistidas em disco. Isso garante a durabilidade.
Undo (desfazer): desfaz as operações de transações que não foram confirmadas (ativas no momento da falha), garantindo a atomicidade.
Além disso, o checkpoint não é um marco que faz o sistema ignorar as operações registradas após ele. O checkpoint serve apenas para delimitar o ponto de partida da análise do log, reduzindo o trabalho de recuperação, mas todas as operações posteriores a ele — de transações confirmadas ou não — precisam ser consideradas. Ignorá-las deixaria o banco em estado inconsistente.
Portanto, a alternativa E é a correta, pois a afirmação é falsa.
Gabarito: letra E
Link permanente: /questoes/ce417348