MySQL: Uma explicação detalhada sobre transações no MySQL e…

Última atualização: 2026-08-26

As transações garantem a atomicidade das operações com dados — elas são totalmente bem-sucedidas ou totalmente malsucedidas.

Esta aula explica os princípios e o uso das transações.

100%
graph TB
    A[START TRANSACTION] --> B[ExecuteSQLOperation]
    B --> C{Was it successful??}
    C -->|All successful| D[COMMIT]
    C -->|Partial failure| E[ROLLBACK]
    B --> F[SAVEPOINT Save Point]
    F --> G[ROLLBACK TO sp]
    G --> B
    D --> H[Data Persistence]
    E --> I[Data Restored to Before Transaction]

1. O que você vai aprender


2. Uma história real sobre uma transferência bancária

(1) Problema: a transferência falha no meio do processo

A transfere 100 yuans para B:

SQL
UPDATE accounts SET balance = balance - 100 WHERE id = 1;  -- Success
-- At this point, the system crashes
UPDATE accounts SET balance = balance + 100 WHERE id = 2;  -- Not executed

Resultado: A ficou com um déficit de 100, e B não recebeu nada — o dinheiro simplesmente desapareceu no ar.

(2) Resolução de transações

SQL
START TRANSACTION;
UPDATE accounts SET balance = balance - 100 WHERE id = 1;
UPDATE accounts SET balance = balance + 100 WHERE id = 2;
COMMIT;  -- Submit only if both are successful

3. Propriedades do ACID

Recurso Descrição Implementação
Atomicidade Uma transação é uma unidade indivisível de trabalho log de reversão
Consistência Os dados permanecem consistentes antes e depois de uma transação Camada de aplicação + restrições
Isolamento As transações simultâneas não interferem umas nas outras Bloqueios + MVCC
Durabilidade Os dados são armazenados permanentemente após o envio log de refazer

4. Operações de transação

▶ Exemplo: Transações básicas

SQL
-- Start Transaction
START TRANSACTION;

-- Perform an operation
UPDATE accounts SET balance = balance - 100 WHERE id = 1;
UPDATE accounts SET balance = balance + 100 WHERE id = 2;

-- Commit Transaction
COMMIT;

-- Or roll back the transaction
ROLLBACK;
▶ Experimente

▶ Exemplo: SAVEPOINT

SQL
START TRANSACTION;

INSERT INTO orders (customer_id, amount) VALUES (1, 100);
SAVEPOINT sp1;

INSERT INTO order_items (order_id, product_id) VALUES (LAST_INSERT_ID(), 1);
SAVEPOINT sp2;

-- Roll back to sp1(Retain the first item INSERT)
ROLLBACK TO sp1;

-- Submit(Keep only the first one INSERT)
COMMIT;
▶ Experimente

5. Envio automático

▶ Exemplo: AUTOCOMMIT

SQL
-- View Auto-Submit Status
SELECT @@autocommit;

-- Turn off Auto-Submit
SET autocommit = 0;

-- Enable Auto-Submit
SET autocommit = 1;
▶ Experimente
autocommit Descrição
1 (padrão) Confirmar automaticamente cada instrução
0 Requer um COMMIT manual

6. Níveis de isolamento de transações

Nível de isolamento Leitura suja Leitura não repetível Leitura fantasma Desempenho
LEITURA NÃO CONFIRMADA Máximo
LEITURA CONFIRMADA Alto
LEITURA REPETÍVEL (Padrão) Média
SERIALIZÁVEL Mais baixo

▶ Exemplo: Definindo o nível de isolamento

SQL
-- View the current isolation level
SELECT @@transaction_isolation;

-- Set the isolation level
SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED;
▶ Experimente

7. Demonstração de problemas de concorrência

(1) Leitura suja

SQL
-- Transaction A
START TRANSACTION;
UPDATE accounts SET balance = 1000 WHERE id = 1;
-- Not committed

-- Transaction B (READ UNCOMMITTED)
SELECT balance FROM accounts WHERE id = 1;  -- Read 1000 (Dirty Data)

-- Transaction A
ROLLBACK;  -- Rollback

-- Transaction B: data read is now invalid

(2) Leituras não repetíveis

SQL
-- Transaction A
START TRANSACTION;
SELECT balance FROM accounts WHERE id = 1;  -- Read 500

-- Transaction B
UPDATE accounts SET balance = 1000 WHERE id = 1;
COMMIT;

-- Transaction A
SELECT balance FROM accounts WHERE id = 1;  -- Read 1000 (Inconsistent)
COMMIT;

❓ Perguntas Frequentes

P: Qual é o nível de isolamento padrão no MySQL? R: REPEATABLE READ, implementado por meio de MVCC + bloqueios de intervalo.

P: O que acontece se uma transação não for confirmada? R: O bloqueio permanece ativo, e outras transações podem atingir o tempo limite enquanto aguardam.

P: É possível reverter um DDL? R: Não, o DDL é confirmado automaticamente e não pode ser revertido.

P: O que significa “confirmação implícita”? R: Quando instruções DDL (CREATE/ALTER/DROP) são executadas, a transação atual é automaticamente confirmada; isso é conhecido como confirmação implícita.

P: Quais são os riscos associados a transações de grande porte? R: Duração prolongada dos bloqueios, aumento excessivo do log de reversão e aumento da latência entre mestre e escravo. Recomenda-se dividi-las em transações menores.


📖 Resumo


📝 Exercícios

  1. Problema básico (Dificuldade: ⭐): Escreva uma transação que transfira 100 da Conta A para a Conta B.

  2. Problema avançado (Dificuldade ⭐⭐): Use SAVEPOINT para implementar uma reversão parcial.

  3. Questão desafiadora (Dificuldade: ⭐⭐⭐): Demonstre o problema da leitura não repetível e resolva-o utilizando o nível de isolamento REPEATABLE READ.

Web-Tutorial.com

Equipe Técnica Web-Tutorial

Uma plataforma de tutoriais mantida por diversos desenvolvedores. Cada tutorial é escrito e revisado por profissionais da área correspondente. Trabalhamos para manter nosso conteúdo preciso e confiável — se encontrar algum problema, avise-nos.

100%