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.
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
- As propriedades ACID das transações
- INICIAR TRANSAÇÃO / CONFIRMAR / REVERTER
- SAVEPOINT Ponto de salvamento
- Confirmação automática (AUTOCOMMIT)
- Níveis de isolamento de transações
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:
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
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
-- 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;
▶ Exemplo: SAVEPOINT
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;
5. Envio automático
▶ Exemplo: AUTOCOMMIT
-- View Auto-Submit Status
SELECT @@autocommit;
-- Turn off Auto-Submit
SET autocommit = 0;
-- Enable Auto-Submit
SET autocommit = 1;
| 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
-- View the current isolation level
SELECT @@transaction_isolation;
-- Set the isolation level
SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED;
7. Demonstração de problemas de concorrência
(1) Leitura suja
-- 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
-- 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
- Transações garantem a atomicidade das operações; elas são totalmente bem-sucedidas ou totalmente malsucedidas.
- ACID: Atomicidade, Consistência, Isolamento, Durabilidade
- COMMIT: Confirmar, ROLLBACK: Reverter, SAVEPOINT: Ponto de salvamento
- Níveis de isolamento controlam problemas de concorrência: leituras sujas, leituras não repetíveis e leituras fantasmas
- O padrão do MySQL é REPEATABLE READ
📝 Exercícios
-
Problema básico (Dificuldade: ⭐): Escreva uma transação que transfira 100 da Conta A para a Conta B.
-
Problema avançado (Dificuldade ⭐⭐): Use SAVEPOINT para implementar uma reversão parcial.
-
Questão desafiadora (Dificuldade: ⭐⭐⭐): Demonstre o problema da leitura não repetível e resolva-o utilizando o nível de isolamento REPEATABLE READ.