MySQL: Mecanismos de bloqueio do MySQL e os princípios do…
Última atualização: 2026-08-26
Os bloqueios são o cerne do controle de concorrência — só é possível escrever código concorrente eficiente se compreender como os bloqueios funcionam.
Esta aula explica o mecanismo de bloqueio do MySQL.
1. O que você vai aprender
- Bloqueios de tabela x bloqueios de linha
- Bloqueios compartilhados (bloqueios S) e bloqueios exclusivos (bloqueios X)
- Bloqueio de intenção
- MVCC (Controle de Concorrência Multiversão)
- Detecção e tratamento de impasses
2. Tipos de fechaduras
graph TB
A[MySQL Locks] --> B[By Granularity]
A --> C[By Type]
B --> D[Table Lock Table Lock]
B --> E[Row Lock Row Lock]
B --> F[Page Lock]
C --> G[Shared Lock S Lock]
C --> H[Exclusive Lock X Lock]
C --> I[Intent Lock Intention Lock]
| Dimensão | Bloqueio de tabela | Bloqueio de linha |
|---|---|---|
| Granularidade | Tabela inteira | Linha única |
| Probabilidade de conflito | Alta | Baixa |
| Desempenho em concorrência | Baixo | Alto |
| Custo | Baixo | Alto |
| Motor | MyISAM/InnoDB | InnoDB |
3. Bloqueios compartilhados e bloqueios exclusivos
(1) Bloqueio compartilhado (S Lock)
-- Acquire a shared lock (read lock) — MySQL 8.0+ Recommended Syntax
SELECT * FROM users WHERE id = 1 FOR SHARE;
-- MySQL 5.7 old syntax (8.0 deprecated but still usable)
-- SELECT * FROM users WHERE id = 1 LOCK IN SHARE MODE;
-- Other transactions can read, but cannot write
(2) Bloqueio exclusivo (X Lock)
-- Set an exclusive lock (write lock)
SELECT * FROM users WHERE id = 1 FOR UPDATE;
-- Other transactions cannot read (if also locked) or write
| Tipo de bloqueio | Leitura | Gravação |
|---|---|---|
| Bloqueio compartilhado S | ✅ | ❌ |
| Bloqueio Exclusivo X | ❌ | ❌ |
4. Bloqueio de intenção
Um bloqueio de intenção é um bloqueio no nível da tabela usado para determinar rapidamente se uma linha em uma tabela está bloqueada.
| Bloqueio de intenção | Descrição |
|---|---|
| IS (Bloqueio Compartilhado de Intenção) | A transação pretende aplicar um bloqueio S à linha |
| IX (Bloqueio Exclusivo de Intenção) | A transação pretende aplicar um bloqueio X à linha |
Objetivo: Ao adquirir um bloqueio de tabela, não há necessidade de verificar cada linha individualmente; basta verificar apenas o bloqueio pretendido.
▶ Exemplo: Aplicações práticas de fechaduras
-- Session 1: Set an exclusive lock
START TRANSACTION;
SELECT * FROM accounts WHERE id = 1 FOR UPDATE;
-- At this moment id=1 is locked
-- Session 2: Try updating (Waiting)
UPDATE accounts SET balance = 500 WHERE id = 1;
-- Wait until Session 1 commits or times out
-- Session 1: Commit
COMMIT;
-- Session 2 execution succeeds
5. MVCC (Controle de Concorrência Multiversão)
O MVCC permite leituras sem bloqueio ao manter várias versões dos dados.
(1) Como funciona o MVCC
graph LR
A[Current Data] --> B[Undo Log<br/>History of Versions]
B --> C[v1] --> D[v2] --> E[v3]
F[Read View] -->|Based on the quarantine level| G[Which version to read?]
(2) Comportamento de leitura para diferentes níveis de isolamento
| Nível de isolamento | Modo de leitura |
|---|---|
| LEITURA NÃO CONFIRMADA | Sempre lê a versão mais recente (pode resultar em uma leitura suja) |
| READ COMMITTED | Criar uma nova Read View para cada SELECT |
| LEITURA REPETÍVEL | Criar uma visão de leitura no início da transação |
| SERIALIZABLE | Leitura bloqueada |
6. Impasse
(1) O que é um impasse?
Duas transações estão aguardando uma à outra para liberar um bloqueio:
-- TransactionsA
START TRANSACTION;
UPDATE accounts SET balance = 100 WHERE id = 1; -- Lock id=1
UPDATE accounts SET balance = 200 WHERE id = 2; -- Waiting for id=2
-- Transaction B
START TRANSACTION;
UPDATE accounts SET balance = 300 WHERE id = 2; -- Lock id=2
UPDATE accounts SET balance = 400 WHERE id = 1; -- Waiting for id=1 (Deadlock!)
(2) Tratamento de impasses
-- View deadlock information
SHOW ENGINE INNODB STATUS\G
-- Set the lock wait timeout (seconds)
SET innodb_lock_wait_timeout = 50; -- seconds
(3) Evite impasses
| Estratégia | Descrição |
|---|---|
| Ordem fixa | Acessar tabelas e linhas na mesma ordem |
| Reduzir o tempo de retenção do bloqueio | Confirmar as transações o mais rápido possível |
| Use um nível de isolamento mais baixo | Menos bloqueios READ COMMITTED |
| Crie índices com critério | Reduza o escopo do bloqueio |
7. Tempo limite de espera do bloqueio
-- View Lock Wait Timeout
SELECT @@innodb_lock_wait_timeout;
-- Settings (seconds)
SET innodb_lock_wait_timeout = 10;
-- Timeout Error
-- ERROR 1205: Lock wait timeout exceeded
❓ Perguntas Frequentes
P: O InnoDB usa bloqueios de tabela ou bloqueios de linha? R: Por padrão, ele usa bloqueios de linha (baseados em índice). Quando não há índice, ele recorre aos bloqueios de tabela.
P: Uma instrução SELECT adquire um bloqueio? R: Uma instrução SELECT comum não adquire um bloqueio (leitura de instantâneo MVCC).
SELECT ... FOR UPDATEadquire um bloqueio exclusivo, eSELECT ... FOR SHARE(MySQL 8.0+) adquire um bloqueio compartilhado. A sintaxe legadaLOCK IN SHARE MODEfoi descontinuada na versão 8.0.
P: Como faço para visualizar os bloqueios atuais? R:
SELECT * FROM performance_schema.data_locks;(MySQL 8.0)
P: O InnoDB usa bloqueios de tabela ou bloqueios de linha? R: Por padrão, ele usa bloqueios de linha, que são implementados com base em índices. Quando não há índices, ele recorre aos bloqueios de tabela.
P: Uma instrução SELECT adquire um bloqueio? R: Uma instrução SELECT comum não adquire um bloqueio (leitura de instantâneo MVCC); FOR UPDATE adquire um bloqueio exclusivo; FOR SHARE adquire um bloqueio compartilhado.
📖 Resumo
- Os bloqueios de tabela apresentam granularidade grossa e baixa concorrência, enquanto os bloqueios de linha apresentam granularidade fina e alta concorrência.
- Bloqueios de compartilhamento (S) permitem várias leituras, enquanto bloqueios exclusivos (X) permitem gravações exclusivas
- O MVCC permite leituras sem bloqueio por meio do controle de concorrência multiversão
- Impasse ocorre quando os processos ficam aguardando uns pelos outros; o MySQL detecta isso automaticamente e reverte uma das transações.
- Evitar impasses: Ordem de acesso fixa, Reduzir o tempo de retenção do bloqueio
📝 Exercícios
-
Questão básica (Dificuldade: ⭐): Explique a diferença entre um bloqueio compartilhado e um bloqueio exclusivo.
-
Exercício avançado (Dificuldade: ⭐⭐): Crie um cenário de impasse e observe como o MySQL lida com ele.
-
Questão desafiadora (Dificuldade: ⭐⭐⭐): Compare o comportamento de leitura e gravação simultâneas em diferentes níveis de isolamento.