Bancos de dados SQL em geral, não somente o o SQL Server, são transacionais, isto é, eles permitem você executar uma sequência de operações como um bloco indivisível de forma a garantir a integridade dos dados em um ambiente com acesso concorrente.
Em outras palavras uma Transação, ou Transactions, é o processo todo de consulta ou manipulação do banco de dados. É uma forma de estabelecer que algo deva ser feito atomicamente, ou seja, ou faz tudo ou faz nada, não pode fazer pela metade. É tudo feito em uma viagem da aplicação para o banco de dados. Em condições normais enquanto a transação não termina outras transações não podem ver o que esta está fazendo.
Esses 3 comandos SQL são para controlar isso.
Dica de Leitura: Se você está explorando o mundo das transações em bancos de dados SQL, é natural se perguntar sobre outras formas de manipular e consultar dados de maneira eficiente. Uma área interessante para explorar é a diferença entre funções e procedures, tanto em Node.js quanto em SQL, pois entender esses conceitos pode aprimorar significativamente a sua capacidade de desenvolver soluções robustas e escaláveis. Para mergulhar mais fundo nessa distinção, confira o artigo SQL – Diferenças Entre Funções e Procedures, que oferece insights valiosos sobre como esses elementos podem ser utilizados para melhorar a performance e a organização do seu código.
O BEGIN TRANSACTION indica onde ela deve começar, então os comando SQL a seguir estarão dentro desta transação.
O COMMIT TRANSACTION indica o fim normal da transação, o que tiver de comando depois já não fará parte desta transação. Neste momento tudo o que foi manipulado passa fazer parte do banco de dados normalmente e operações diversas passam enxergar o que foi feito.
O ROLLBACK TRANSACTION também fecha o bloco da transação e é a indicação que a transação deve ser terminada, mas tudo que tentou ser feito deve ser descartado porque alguma coisa errada aconteceu e ela não pode terminar normalmente. Nada realizado dentro dela será perdurado no banco de dados.
Ao contrário do que muita gente acredita rollback no contexto de banco de dados não significa reverter e sim voltar ao estado original. Um processo de reversão seria de complicadíssimo à impossível. Um processo de descarte é simples e pode ser atômico.
A maioria dos comandos SQL são transacionais implicitamente, ou seja, ele por si só já é uma transação. Você só precisa usar esses comandos citados quando precisa usar múltiplos comandos e todos esses devam rodar atomicamente. Ou seja, eles funcionam como as chaves de um código, eles criam um bloco. Na verdade está mais para o using do C# já que há uma consequência garantida no final da execução.
CREATE TABLE ValueTable (id int);
BEGIN TRANSACTION; -- aqui começa a transação
INSERT INTO ValueTable VALUES(1);
INSERT INTO ValueTable VALUES(2);
COMMIT; -- aqui termina e "grava" tudo
Enquanto não dá o COMMIT essas inserções não constam de fato no banco de dados. Um ROLLBACK descartaria tudo feito antes.
A documentação tem mais informações e o assunto é interessante, pena não ter mais perguntas sobre isto.
Para melhor compreensão é preciso entender o que é o ACID.
O que é o ACID no SQL?
A sigla ACID significa:
- Atomicidade É algo indivisível. Ou tudo o que está em uma transação deve ser realizado com sucesso, ou nada deve ser realizado. Pelo menos nada deva ser considerado como realizado. Sem a atomicidade fica difícil se não impossível manter as outras características, por isso a transação é importante.
- Consistência O banco de dados deve ter uma transação terminada em estado consistente, ou seja, deve respeitar todas as regras impostas no banco de dados para todos os envolvidos na transação.
- Isolamento Uma transação não pode interferir em outra enquanto está em atividade. Só após sua conclusão é que o seu resultado ficará disponível para outras transações.
- Durabilidade Ao final da transação o resultado deve permanecer no banco de dado, aconteça o que acontecer.
Sem essas características o banco de dados não é confiável. Uma operação pode terminar pela metade, ou pode estar em um estado que causará problemas, ou manipulará dados que ainda não se sabe se serão úteis ou finais ou ainda pode perder o que foi feito.
Alguns bancos de dados se dizem ACID quando na verdade são apenas quase ACID 🙂 Eles são ACID, pero no mucho, tem alguns casos que eles não garantem isso, ou seja eles dizem que estão mais ou menos grávidos 🙂
O conceito é implementado para evitar condições de corrida e problemas semelhantes. No link tem um exemplo de conta bancária que é o clássico problema.
- Se você precisa atualizar o saldo de uma conta precisa garantir que tudo o que é feito para mudar o saldo deve ser realizado até o fim, não pode mudar em uma tabela e não mudar em outra, não pode debitar em uma conta e deixar de debitar em outra (atomicidade).
- No final da transação não pode deixar o saldo com um valor que foi determinado que não seja permitido, por exemplo: saldo normal mais limite ser negativo, ou o saldo não ter uma operação vinculada a ele (consistência).
- Não pode deixar outras transações verem o crédito até que se conclua, já que a transação pode não dar certo ou pode ser que durante ela também tenha outros créditos ou débitos que afetarão o resultado final (isolamento).
- Não pode deixar de manter o novo valor do saldo e tudo o que foi realizado para se chegar nele (durabilidade).
Normalmente isto é obtido por um sistema de journaling, write ahead log ou alguma forma semelhante. É importante que as operações da transação sejam feitas fora do acesso normal do banco de dados e só entre no seu final. As técnicas mais utilizadas são two phase locking, multi version concurrency control e snapshot isolation.
Bancos de dados Relacionais e NoSQL
Os bancos de dados chamados de NoSQL não costumam ser ACID (alguns até são, alguns são parcialmente, ou seja, não são). Os que são não oferecem todas aquelas vantagens que dizem que o NoSQL tem, não existe milagre. Ou eles não são confiáveis. Claro que problemas que o desempenho geral e a distribuição são mais importantes que a confiabilidade da informação então ele é útil. Bancos de dados ACID podem ter melhor desempenho em certos cenários.
Se não souber o que está fazendo o NoSQL pode ser trágico e muito mais lento. NoSQL opta pelo BASE que podemos chamar de oposto do ACID, ainda que não seja bem assim.
Veja sobre o CAP theorem. Ele mostra que não existe milagre. Não acredite em falsos profetas que prometem que vão resolver todos os problemas e quebrar o CAP theorem.
Voltando a falar sobre Transações (Transactions) em SQL
No livro Sistemas de banco de dados, de Elmasri & Navathe, os capítulos 17 a 19 (páginas 395 a 452, 4ª edição) tratam da teoria do processamento de transações. Sobre a pergunta “O que são transações”, o texto informa que “Uma transação inclui uma ou mais operações de acesso ao banco de dados – englobam operações de inserção, exclusão, alteração ou recuperação” e também cita que “Uma transação é uma unidade atômica de trabalho que ou estará completa ou não foi realizada“.
Outra parte de sua pergunta menciona BEGIN TRANSACTION, COMMIT e ROLLBACK: “Um meio para especificar os limites de uma transação é estabelecer explicitamente declarações de início de transação e fim de transação“. No caso das instruções SQL que citou, BEGIN TRANSACTION refere-se a início da transação e COMMIT ao final da transação.
Ao utilizar o par BEGIN TRANSACTION/COMMIT definem-se os limites da transação: “… todas as operações de acesso ao banco de dados, entre as duas, serão consideradas parte da transação“.
Como exemplo, o caso clássico de transferência de valor entre duas contas bancárias. A programação deve ser de tal forma que não seja possível a retirada do valor da conta e, por uma falha qualquer, o processo seja interrompido antes que o valor seja depositado na conta do destinatário.
-- código #1
declare @contaDe char(6), @contaPara char(6), @Valor money;
set @contaDe= '029820';
set @contaPara= '407302';
set @Valor= 1200.00;
BEGIN TRANSACTION;
UPDATE CONTA_CORRENTE
set saldoConta= saldoConta - @Valor
where numConta = @contaDe;
UPDATE CONTA_CORRENTE
set saldoConta= saldoConta + @Valor
where numConta = @contaPara;
COMMIT;
go
No caso de transferência bancária há vários procedimentos adicionais, mas o objetivo aqui é exemplificar a utilização das instruções BEGIN TRANSACTION e COMMIT.
Já a instrução ROLLBACK “reverte uma transação explícita ou implícita ao começo da transação ou a um ponto de salvamento dentro da transação“, conforme consta na documentação da instrução. Geralmente é utilizada quando ocorre algo inesperado no processamento e é necessário então desfazer o processamento realizado na transação.
O conceito de transação está intimamente ligado a concorrência de processos e também às propriedades ACID (atomicidade, consistência, isolamento e durabilidade).
Documentação em português, para SQL Server:
LEIA TAMBÉM:
- Paralelismo em Python usando concurrent.futures(Abre numa nova aba do navegador)
- Ferramentas para rastrear baleias cripto e comprar no mergulho(Abre numa nova aba do navegador)
- SQL – Diferenças entre Not IN e Not EXISTS(Abre numa nova aba do navegador)
- Maneiras de aprender SQL e banco de dados online
- Quest lança versão beta pública do SharePlex para PostgreSQL
- Python 3.11 vem com grandes melhorias de desempenho
- Como aprender a programar, um guia definitivo
- Como assinar um PDF digitalmente em PHP
- Design de Games: O que é preciso para trabalhar na área?
Continue aprendendo:
Agora que você já sabe sobre transações em bancos de dados SQL, que tal aprender mais sobre como otimizar o desempenho de suas aplicações com Redis em bancos relacionais? Clique aqui para descobrir como melhorar a performance das suas aplicações.
FAQ: Transações ACID no Desenvolvimento de Software
1. O que acontece se o meu servidor (Node.js/Python) cair a meio de uma transação SQL?
+
Graças à regra da Atomicidade (A) do padrão ACID, se a ligação entre a sua API e o banco de dados for cortada antes de ser emitido o comando COMMIT, o banco de dados executará automaticamente um ROLLBACK invisível. Nenhuma inserção parcial será gravada, garantindo que o seu sistema nunca fica num estado inconsistente.
2. Bancos de dados NoSQL (como o MongoDB) suportam transações ACID?
+
Tradicionalmente, os bancos NoSQL seguiam o modelo BASE (focado em disponibilidade e consistência eventual). No entanto, em 2026, a maioria dos grandes bancos NoSQL (incluindo o MongoDB a partir da versão 4.0) já suporta transações ACID multi-documento nativamente. Contudo, utilizar estas transações em ambientes distribuídos NoSQL tem um custo significativo de performance em comparação com bancos relacionais como o PostgreSQL.
3. Como gerir transações ao utilizar ORMs (como Prisma ou TypeORM)?
+
Em projetos modernos, raramente escrevemos BEGIN TRANSACTION à mão. Os ORMs fornecem métodos embutidos (como o $transaction no Prisma) que englobam múltiplas Promises (consultas). Se qualquer uma dessas Promises falhar (lançar um erro), o ORM cuida de acionar o ROLLBACK internamente e devolve a exceção para ser tratada no seu bloco try/catch.

