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 é
Aa substituição do fluxo por ALTER TABLE para isolar a gravação em Auditoria em um objeto temporário e evitar conflitos.
BBEGIN TRANSACTION seguido de COMMIT TRANSACTION para confirmar parcialmente as alterações feitas na procedure.
CROLLBACK WORK para reverter a última instrução DML executada na procedure, preservando as demais alterações.
Da criação de um ponto de salvamento com SAVE TRANSACTION e a reversão pontual com ROLLBACK TRANSACTION.
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.
1BEGIN TRANSACTION
2INSERT em Movimentacao
3SAVE TRANSACTION ponto
4INSERT em Auditoria (erro)
5ROLLBACK TRANSACTION ponto
6Transação continua ativa
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.