CodeGym /Cursos /SQL SELF /Introdução às transações: BEGIN, COM...

Introdução às transações: BEGIN, COMMIT, ROLLBACK

SQL SELF
Nível 22, Lição 1
Disponível

No nosso curso, a gente vai falar de transações três vezes. E toda vez vai rolar uma novidade. Agora vamos ver o básico das transações. Mais pra frente, vamos entender os níveis de isolamento das transações, e no finalzinho do curso — os detalhes das transações aninhadas.

O que é uma transação

Vamos começar do simples — definição. Transação é um grupo de ações que só rolam juntas. Só isso.

Daí vem uma parada importante: se der ruim em qualquer (qualquer mesmo!) ação do grupo, tem que desfazer o resultado de todas as outras e voltar o sistema pro estado inicial.

Do ponto de vista do SQL, uma transação é um conjunto de ações (tipo inserir, atualizar ou deletar dados), que garante que ou todas as operações dentro da transação terminam de boa, ou nenhuma delas é feita. Esse comportamento deixa o trabalho com banco de dados confiável e consistente, principalmente em situações críticas, tipo processamento de pagamentos ou atualização de dados relacionados.

Imagina que você tá transferindo grana entre duas contas bancárias. Simplificando, temos duas operações seguidas:

  1. O valor é debitado de uma conta.
  2. O mesmo valor é creditado em outra conta.

Se der pau bem no final da operação (tipo, o servidor cai), é importante que ninguém saia perdendo. Ou seja, ou os dois passos dão certo (transação é confirmada), ou os dois são desfeitos (transação é cancelada).

Transações e os princípios ACID

Transações seguem os princípios ACID, que lembram a gente de quatro características chave:

  • Atomicity (Atomicidade): tudo ou nada. Ou todas as operações dentro da transação rolam, ou tudo é desfeito.
  • Consistency (Consistência): os dados ficam certinhos antes e depois da transação.
  • Isolation (Isolamento): cada transação age como se fosse a única no sistema.
  • Durability (Durabilidade): depois de confirmar, os dados ficam salvos, mesmo se o servidor cair.

Comandos principais pra controlar transações

Agora bora pra prática! Aqui vão os três comandos principais pra controlar transações:

  1. BEGIN
    Começa uma nova transação. Tudo que vier depois vai rolar dentro dela.

  2. COMMIT
    Confirma as mudanças. Depois desse comando, tudo fica permanente.

  3. ROLLBACK
    Cancela as mudanças. Se algo der errado, dá pra desfazer a transação e os dados voltam ao que eram.

Sintaxe básica de transações

Estrutura simples de uma transação:

BEGIN; 
-- aqui vão suas operações SQL
COMMIT;

Exemplo de uso do ROLLBACK:

BEGIN;
-- alteração na tabela students
UPDATE students
SET grade = grade + 10
WHERE id = 1;

-- Opa! Percebemos que foi um erro.
ROLLBACK;

Exemplo de uso de transação numa tarefa real

Vamos supor que temos as tabelas:

students:

id name grade
1 Otto Lin 85
2 Anna Song 90

courses:

course_id course_name
1 Matemática
2 História

Vamos dizer que queremos matricular um estudante num curso e atualizar a nota dele ao mesmo tempo:

BEGIN;

-- Passo 1: Adiciona registro na tabela "matrículas em cursos"
INSERT INTO course_enrollments (student_id, course_id)
VALUES (1, 2);

-- Passo 2: Atualiza a nota do estudante
UPDATE students
SET grade = grade + 5
WHERE id = 1;

COMMIT;

O que acontece se o servidor cair entre o primeiro e o segundo passo? Se não usássemos transação, os dados iam ficar inconsistentes: a matrícula seria feita, mas a nota não seria atualizada. Mas com transação, ou as duas operações rolam, ou as duas são desfeitas.

Lidando com erros dentro de transações

Às vezes dá ruim e a gente precisa tratar o erro direito. No PostgreSQL, a transação é desfeita automaticamente se rolar um erro.

Bora errar de propósito pra ver o que acontece. Imagina que tem uma restrição de unicidade na coluna student_id da tabela course_enrollments. Vamos tentar adicionar uma linha duplicada:

BEGIN;

INSERT INTO course_enrollments (student_id, course_id)
VALUES (1, 2);

-- FIM DA TRANSAÇÃO (ainda não foi feito)
COMMIT;

Se tentar inserir um estudante que já tá matriculado no curso, vai dar erro, e o PostgreSQL vai desfazer a transação automaticamente.

Usando ROLLBACK pra desfazer manualmente

Muitas vezes não dá pra prever o erro, e você vai querer desfazer a transação se algo der errado:

BEGIN;

-- Adiciona novo estudante
INSERT INTO students (name, grade)
VALUES ('Omori Sanny', 75);

-- Opa! Percebemos que adicionamos o estudante sem querer.
ROLLBACK;

Depois do comando ROLLBACK a tabela fica igualzinha — Omori Sanny nem apareceu no students.

Dicas úteis e erros comuns

Trabalhar com transações fica mais fácil se você lembrar de algumas regrinhas:

  • Sempre use transações se sua operação tiver mais de um passo, principalmente se for mexer em várias tabelas.
  • Nunca esqueça de confirmar as mudanças (COMMIT). Senão a transação fica pendurada e nada muda nos dados.
  • Envolva operações complicadas em transações pra garantir a consistência dos dados.
  • Se ver erro em qualquer etapa, não tenha medo de usar o ROLLBACK.

Agora que você já sabe como controlar operações com transações, bora colocar isso em prática e aprender mais sobre como garantir a integridade dos dados!

2
Tarefa
SQL SELF, nível 22, lição 1
Bloqueado
Transação simples com commit
Transação simples com commit
Comentários
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION