O que acontece se a luz cair no meio de uma transferência de R$ 1.000?
O sistema executa um UPDATE retirando o dinheiro da Conta A. Logo em seguida, o servidor cai antes de executar o UPDATE na Conta B. Para onde vai o dinheiro? A resposta está na TCL (Transaction Control Language) e no modelo ACID.
Transações não aceitam estados intermediários ou dados inconsistentes.
1. A Fundação: Conceito ACID e Comandos TCL
As quatro propriedades fundamentais e os comandos que controlam o fluxo de dados.
Tudo ou Nada
A transação é um bloco indivisível. Se uma única instrução falhar, 100% da operação é abortada e desfeita.
Regras do Jogo
O banco transiciona de um estado válido a outro estado válido, respeitando todas as regras, chaves e restrições.
Fila Invisível
Operações concorrentes não interferem entre si. Ninguém vê alterações não finalizadas (BEGIN em aberto).
Escrito em Pedra
Após o COMMIT, os dados estão salvos permanentemente no disco, mesmo em quedas de energia.
2. Exemplo Guia Completo para Apresentar em Sala
Criação da Tabela e Carga Inicial
Criamos a tabela contas_bancarias com restrição CHECK para saldo não ficar negativo e inserimos dois clientes (Carlos e Mariane).
Transferência PIX Bem-Sucedida
Iniciamos com BEGIN, debitamos R$ 200 do Carlos (ID 1) e creditamos R$ 200 na Mariane (ID 2). Finalizamos com COMMIT.
Simulação de Falha / Botão de Pânico
Iniciamos nova transação, descontamos R$ 500 do Carlos, mas percebemos um erro no ID do destinatário. Disparamos ROLLBACK e nenhum centavo é perdido.
Salvamento Parcial com Checkpoint
Processamos pagamento de bônus, salvamos com SAVEPOINT ponto1. Ao tentar uma cobrança indevida, desfazemos apenas de volta para o ponto salvo com ROLLBACK TO ponto1.
-- ============================================================ -- AULA 15: DEMONSTRAÇÃO PRÁTICA DE TCL (TRANSACTIONS) -- ============================================================ -- PASSO 1: Preparar a estrutura de dados DROP TABLE IF EXISTS contas_bancarias; CREATE TABLE contas_bancarias ( id INT PRIMARY KEY, titular VARCHAR(50) NOT NULL, saldo NUMERIC(10,2) CHECK (saldo >= 0) ); INSERT INTO contas_bancarias (id, titular, saldo) VALUES (1, 'Carlos Silva', 1000.00), (2, 'Mariane Costa', 500.00); -- Conferir estado inicial (Carlos: 1000, Mariane: 500) SELECT * FROM contas_bancarias; -- PASSO 2: Transação Com Sucesso (COMMIT) BEGIN; -- Inicia a transação isolada UPDATE contas_bancarias SET saldo = saldo - 200.00 WHERE id = 1; UPDATE contas_bancarias SET saldo = saldo + 200.00 WHERE id = 2; COMMIT; -- Grava permanentemente! (Carlos: 800, Mariane: 700) -- PASSO 3: Transação Com Cancelamento/Erro (ROLLBACK) BEGIN; UPDATE contas_bancarias SET saldo = saldo - 500.00 WHERE id = 1; -- Ops! Identificamos um erro de digitação ou o destinatário não existe! ROLLBACK; -- Desfaz tudo desde o último BEGIN! -- Conferencia: O saldo de Carlos PERMANECE em 800.00! SELECT * FROM contas_bancarias WHERE id = 1; -- PASSO 4: Uso de Ponto de Salvamento (SAVEPOINT) BEGIN; UPDATE contas_bancarias SET saldo = saldo + 50.00 WHERE id = 1; -- Bônus SAVEPOINT ponto_pos_bonus; -- Marco 1 UPDATE contas_bancarias SET saldo = saldo - 9999.00 WHERE id = 1; -- Falhará ou tentará saldo negativo ROLLBACK TO ponto_pos_bonus; -- Desfaz APENAS a cobrança errada! COMMIT; -- Mantém o bônus de +50.00! (Carlos termina com 850.00)
3. Terminal Interativo de Transações TCL
Teste os botões abaixo para ver o estado das contas mudar ou ser revertido em tempo real.
Painel de Comandos TCL
Operações DML (Transferências)
BEGIN, o banco estará em modo auto-commit.
[SISTEMA] Banco inicializado com sucesso.
32 Exercícios Individuais (Um por Aluno)
Cada aluno possui um tema exclusivo do mundo real para aplicar o ciclo BEGIN, COMMIT, ROLLBACK e SAVEPOINT.