top of page

ACID: BEGIN TRANSACTION, COMMIT e ROLLBACK

  • Foto do escritor: Amanda Nascimento
    Amanda Nascimento
  • 30 de mai. de 2023
  • 4 min de leitura

Atualizado: 7 de ago.


No SQL Server (e em outros SGBDs), usamos transações para garantir que um conjunto de operações ocorra de forma atômica — ou seja, tudo ou nada. Se alguma parte falhar, podemos reverter tudo.


🔄 O que é uma Transação?

É um bloco lógico de instruções SQL que devem ser executadas como uma única unidade de trabalho.


🎯 Finalidade principal:

  • Garantir consistência dos dados.

  • Evitar dados corrompidos em caso de falha parcial.

  • Permitir controle total sobre o que será salvo no banco.


✅ Quando Usar Transações?

  • Ao fazer múltiplas alterações que devem ser executadas em conjunto.

  • Ao depender de validações manuais ou verificações antes de confirmar as mudanças.

  • Em cenários críticos, como movimentações financeiras ou exclusões em cascata.




🔐 ACID: As Propriedades das Transações

Transações seguem o princípio ACID:

Letra

Nome

Descrição

A

Atomicidade

Tudo ou nada é executado

C

Consistência

Os dados permanecem íntegros antes e depois da transação

I

Isolamento

Transações não interferem entre si

D

Durabilidade

Depois do COMMIT, os dados persistem mesmo após falhas do sistema



Estrutura


BEGIN TRANSACTION;

 

-- suas operações aqui (INSERT, UPDATE, DELETE, etc.)

 

-- se tudo estiver certo:

COMMIT;

 

-- se houver erro ou desistência:

ROLLBACK;



Exemplo para alterar dado em um banco relacional sql server:


ree


1º passo (criar uma consulta que apareça apenas os dados que deseja alterar)


A primeira coisa é ter certeza do dado que você quer alterar, para isso, utilize o where para garantir que o que será alterado, será somente o que você realmente precise que seja alterado.


Neste exemplo, dei um select na tabela que quero para estudar os dados e montar meu where que será baseado em duas colunas SECAODESATIVADA ser igual a 0 que significa neste caso que esta ativo, e na coluna CODIGO, os dados que quero alterar necessariamente precisam começar com 0.098.

Assim, vi que neste exemplo serão 74 linhas retornadas na consulta abaixo:


SELECT *

FROM PSECAO

 

WHERE SECAODESATIVADA = 0

AND CODIGO LIKE '0.098%'



2º passo


Recomendo realizar a alteração primeiro no banco de testes e depois no de produção conforme exemplificado na imagem acima.


Primeira etapa é selecionar apenas a palavra BEGIN TRAN e executar (F5)


Irá aparecer uma mensagem se a conexão para alteração tiver se estabelecido: "Commands completed successfully."


Usamos o BEGIN TRAN para abrir uma conexão de alteração com o banco, ou seja, o banco fica aguardando nos próximos instantes a alteração de dados. (Quem estiver com alguma consulta rodando, funcionará normalmente).


3º passo: "UPDATE" "SET" até o "WHERE" e executar (F5)

A alteração será realizada.


4º passo: digite select * from where para ver se de fato os dados foram alterados como era esperado, se sim, COMMIT para gravar os dados em definitivo no banco.


ree

Para prosseguir com a alteração após executar o UPDATE, execute o COMMIT e aguarde a mensagem de confirmação conforme imagem acima.

Ao executar o COMMIT, não é possível voltar atrás, os dados selecionados no where serão alterados e automaticamente o COMMIT fecha a conexão de alteração estabelecida.





Para retornar (CTRL + Z) execute ROLLBACK pois além de retornar para os dados que estavam, ele também serve para fechar a conexão que abrimos com o BEGIN TRAN.

É necessário realizar o fechamento da conexão de alteração estabelecida para melhor funcionamento do banco.



Exemplos


🔌Aqui, você executa a transação, confere se a inserção foi correta, e então decide entre COMMIT ou ROLLBACK:


--Exemplo 1: Inserção com confirmação manual

BEGIN TRANSACTION;

 

INSERT INTO funcionarios (nome, idade, RecCreatedBy)

VALUES ('Carlos', 30, SUSER_SNAME());

 

-- Verifique se deu tudo certo...

-- Se sim, salve:

COMMIT;

 

-- Se não, cancele:

-- ROLLBACK;

 



 🔌O ROLLBACK reverte tudo o que foi feito desde o BEGIN TRANSACTION, deixando a tabela como estava antes da transação:


--Exemplo 2: Atualização com erro simulado

BEGIN TRANSACTION;

 

UPDATE funcionarios

SET idade = 99

WHERE nome = 'Amanda';

 

-- Ops! Atualizou o valor errado. Vamos desfazer:

ROLLBACK;

 

 🔌Se a segunda INSERT falhar, nenhuma das duas deve ser aplicada. Por isso, esse uso com transação garante que ambas aconteçam juntas.


--Exemplo 3: Inserções em múltiplas tabelas

BEGIN TRANSACTION;

 

INSERT INTO funcionarios (nome, idade, RecCreatedBy)

VALUES ('João', 25, SUSER_SNAME());

 

INSERT INTO historico_auditoria (descricao, data)

VALUES ('Novo funcionário inserido: João', GETDATE());

 

COMMIT;

 

 

 🔌Neste modelo, usamos TRY...CATCH para capturar erros. Se ocorrer um erro, ele executa ROLLBACK e mostra a mensagem.


--Exemplo com TRY...CATCH para controle de erros

BEGIN TRY

    BEGIN TRANSACTION;

 

    -- Operações

    UPDATE funcionarios

    SET idade = idade + 1;

 

    -- Simulando erro

    -- SELECT 1 / 0;

 

    COMMIT;

END TRY

BEGIN CATCH

    ROLLBACK;

 

    PRINT 'Erro: ' + ERROR_MESSAGE();

END CATCH;

 

 

 

 

© 2017-2025  Criado e desenvolvido por Amanda Nascimento

  • Discord
  • GitHub
  • youtube
  • LinkedIn Amanda
bottom of page