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


2. Tipos de fechaduras

100%
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)

SQL
-- 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)

SQL
-- 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

SQL
-- 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
▶ Experimente

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

100%
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:

SQL
-- 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

SQL
-- 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

SQL
-- 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 UPDATE adquire um bloqueio exclusivo, e SELECT ... FOR SHARE (MySQL 8.0+) adquire um bloqueio compartilhado. A sintaxe legada LOCK IN SHARE MODE foi 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


📝 Exercícios

  1. Questão básica (Dificuldade: ⭐): Explique a diferença entre um bloqueio compartilhado e um bloqueio exclusivo.

  2. Exercício avançado (Dificuldade: ⭐⭐): Crie um cenário de impasse e observe como o MySQL lida com ele.

  3. Questão desafiadora (Dificuldade: ⭐⭐⭐): Compare o comportamento de leitura e gravação simultâneas em diferentes níveis de isolamento.

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%