Pular para o conteúdo principal

Questão de Banco de Dados — Geral — FCC 2026

Banco de DadosGeral
Código
fc142488
Banca
FCC
Órgão
MPE AL
Ano
2026
Cargo
Ana ( )
Considere o sistema de um Ministério Público Estadual que registra movimentações processuais nas tabelas do SQL Server intituladas Movimentacao e Auditoria, e que um serviço inicia explicitamente uma transação e, em seguida, chama uma stored procedure. Durante a execução da procedure, após a inserção na tabela Auditoria, ocorre um erro tratável que não invalida a transação em andamento. Torna-se necessário desfazer apenas parte das operações realizadas pela procedure, sem encerrar ou invalidar a transação iniciada pelo serviço, a qual deverá permanecer ativa para posterior decisão de confirmação ou cancelamento. Nesse caso, o controle transacional T-SQL que deve ser utilizado é
  1. Aa substituição do fluxo por ALTER TABLE para isolar a gravação em Auditoria em um objeto temporário e evitar conflitos.
  2. BBEGIN TRANSACTION seguido de COMMIT TRANSACTION para confirmar parcialmente as alterações feitas na procedure.
  3. CROLLBACK WORK para reverter a última instrução DML executada na procedure, preservando as demais alterações.
  4. Da criação de um ponto de salvamento com SAVE TRANSACTION e a reversão pontual com ROLLBACK TRANSACTION.
  5. E REVOKE nas permissões da procedure, para que falhas deixem de materializar alterações já persistidas no log.
Revelar gabarito e comentário

GabaritoD — a criação de um ponto de salvamento com SAVE TRANSACTION e a reversão pontual com ROLLBACK TRANSACTION.

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”.

Controle transacional no SQL Server: SAVE TRANSACTION e ROLLBACK TRANSACTION

Gabarito: letra D. Quando uma transação precisa desfazer apenas parte das operações, sem encerrar a transação como um todo, o mecanismo correto no T-SQL é criar um ponto de salvamento com SAVE TRANSACTION e reverter até ele com ROLLBACK TRANSACTION. Isso permite que o serviço mantenha a transação ativa e decida posteriormente entre COMMIT (confirmar tudo) ou ROLLBACK (desfazer tudo).

Uma transação é uma unidade lógica de trabalho que deve ser executada por completo ou não ser executada — é a propriedade da atomicidade. No SQL Server, quando você inicia uma transação com BEGIN TRANSACTION, todas as operações DML (INSERT, UPDATE, DELETE) executadas a partir daí ficam pendentes até que a transação seja finalizada com COMMIT TRANSACTION (confirma permanentemente) ou ROLLBACK TRANSACTION (desfaz tudo). O ROLLBACK tradicional desfaz a transação inteira, o que não atende ao cenário descrito, pois o serviço quer manter a transação viva.

A solução para reverter apenas parte do trabalho é o savepoint (ponto de salvamento). O comando SAVE TRANSACTION nome_do_ponto marca um ponto dentro da transação. Em seguida, se um erro tratável ocorrer e for necessário desfazer apenas as operações feitas após esse ponto, executa-se ROLLBACK TRANSACTION nome_do_ponto. Isso reverte as alterações até o savepoint, mas não encerra a transação — ela continua ativa, e o serviço pode seguir executando outras operações ou, ao final, confirmar com COMMIT ou desfazer tudo com ROLLBACK.

Na prática, imagine que a stored procedure insira um registro na tabela Movimentacao e depois na tabela Auditoria. Se a inserção em Auditoria falhar de forma tratável (por exemplo, uma violação de constraint que pode ser contornada), mas você não quer perder a inserção em Movimentacao, você pode:

BEGIN TRANSACTION;
INSERT INTO Movimentacao ...;
SAVE TRANSACTION ponto_auditoria;
INSERT INTO Auditoria ...; -- erro tratável aqui
ROLLBACK TRANSACTION ponto_auditoria; -- desfaz só a inserção em Auditoria
-- a transação continua ativa
COMMIT TRANSACTION; -- ou ROLLBACK TRANSACTION, se decidir desfazer tudo

A distinção crucial é entre ROLLBACK TRANSACTION sem argumento (desfaz a transação inteira) e ROLLBACK TRANSACTION nome_do_ponto (desfaz apenas até o savepoint). O primeiro encerra a transação; o segundo mantém a transação ativa. É exatamente essa diferença que a alternativa D explora.

A pegadinha da banca está em confundir o ROLLBACK tradicional (que desfaz tudo) com a reversão pontual via savepoint. Muitos candidatos marcam a alternativa C, achando que ROLLBACK WORK desfaz apenas a última instrução — mas isso não é verdade no SQL Server: ROLLBACK WORK é sinônimo de ROLLBACK TRANSACTION e desfaz a transação inteira. A alternativa B também é tentadora, mas COMMIT TRANSACTION confirmaria todas as alterações da procedure, não apenas parte delas, e encerraria a transação — o oposto do que se deseja.

Guarde a fronteira: savepoint = reversão parcial sem encerrar a transação; COMMIT/ROLLBACK sem savepoint = encerramento da transação. É nessa fronteira que as alternativas se dividem.

  1. 1BEGIN TRANSACTION
  2. 2INSERT em Movimentacao
  3. 3SAVE TRANSACTION ponto
  4. 4INSERT em Auditoria (erro)
  5. 5ROLLBACK TRANSACTION ponto
  6. 6Transação continua ativa
  7. 7COMMIT ou ROLLBACK final
LEVEL · soulevel.com.br

Alternativa A — ❌ Incorreta

ALTER TABLE é um comando DDL usado para modificar a estrutura de uma tabela (adicionar/remover colunas, alterar tipos, etc.). Não tem nenhuma relação com controle transacional nem com desfazer operações. A ideia de "isolar a gravação em um objeto temporário" não resolve o problema de reverter parte das operações dentro de uma transação ativa.

Alternativa B — ❌ Incorreta

COMMIT TRANSACTION confirma todas as alterações pendentes da transação e a encerra. O enunciado pede exatamente o contrário: desfazer apenas parte das operações e manter a transação ativa para decisão posterior. Confirmar parcialmente não é possível com COMMIT — ele é tudo-ou-nada.

Alternativa C — ❌ Incorreta

ROLLBACK WORK é um comando válido no T-SQL, mas é sinônimo de ROLLBACK TRANSACTION sem argumento: ele desfaz a transação inteira e a encerra. Não existe a semântica de "reverter apenas a última instrução DML" — o ROLLBACK sempre age sobre a transação como um todo, a menos que seja direcionado a um savepoint (o que não é o caso aqui).

Alternativa D — ✅ Correta ⟵ GABARITO

SAVE TRANSACTION cria um ponto de salvamento dentro da transação, e ROLLBACK TRANSACTION nome_do_ponto reverte as operações até esse ponto, sem encerrar a transação. Isso atende exatamente ao cenário: desfazer apenas parte das operações da procedure, mantendo a transação ativa para o serviço decidir entre COMMIT ou ROLLBACK posteriormente.

Alternativa E — ❌ Incorreta

REVOKE é um comando DCL usado para remover permissões de usuários ou objetos. Não tem relação com controle transacional nem com desfazer alterações. A afirmação de que "falhas deixem de materializar alterações já persistidas no log" é um absurdo técnico — o log de transações é gerenciado pelo SGBD, não por permissões.

NÃO CAIA NESSA!

A banca explora a confusão entre o ROLLBACK tradicional (que desfaz a transação inteira) e a reversão pontual via savepoint. A alternativa C parece plausível porque menciona "reverter a última instrução DML", mas no SQL Server ROLLBACK WORK desfaz tudo. A alternativa B também engana ao sugerir "confirmar parcialmente" — COMMIT é tudo-ou-nada. A chave é lembrar que savepoint = reversão parcial sem encerrar a transação.

PEGA ESSA DICA!

Na prova, quando o enunciado falar em "desfazer apenas parte" e "manter a transação ativa", procure imediatamente por SAVE TRANSACTION ou SAVEPOINT. Essa é a assinatura clássica do savepoint. Compare com o ROLLBACK tradicional, que encerra a transação, e com o COMMIT, que confirma tudo.

Gabarito: letra D

Link permanente: /questoes/fc142488