Bloqueio otimista vs pessimista
Compare os padrões SELECT ... FOR UPDATE (pessimista) e coluna de versão / WHERE updated_at = ? (otimista).
Bloqueio otimista vs pessimista é uma aula grátis de SQL Academy no CoddyKit. Esta é a aula 4 de 4. Você pode ler a aula completa abaixo gratuitamente — depois pratica ao vivo no navegador com um editor de código integrado e um tutor de IA 24/7. Faz parte do caminho de aprendizado de SQL Academy, e seu progresso é sincronizado entre a web e o app CoddyKit. O curso de SQL Academy inclui 4 aulas no total.
Duas estratégias de concorrência
- Pessimista — bloqueie a linha ao lê-la; ninguém mais poderá alterá-la
- Otimista — não bloqueie; ao atualizar, verifique se a linha não foi alterada
Pessimista: SELECT ... FOR UPDATE
Bloqueie agora e grave depois:
BEGIN;
SELECT balance FROM accounts WHERE id = 1 FOR UPDATE;
-- other transactions cannot lock or update this row
-- compute new balance...
UPDATE accounts SET balance = balance - 100 WHERE id = 1;
COMMIT;FOR SHARE
Bloqueio de leitura — outros podem ler, mas não gravar:
SELECT * FROM orders WHERE id = 1 FOR SHARE;
-- others can SELECT FOR SHARE but cannot UPDATEVantagens e desvantagens do bloqueio pessimista
Vantagens: fácil de entender, sem necessidade de repetição.
Desvantagens: reduz a concorrência e pode causar esperas por bloqueios e impasses.
Otimista: coluna de versão
Leia com uma versão e grave usando uma condição WHERE que compare a versão esperada:
BEGIN;
SELECT id, balance, version FROM accounts WHERE id = 1;
-- compute new balance...
UPDATE accounts
SET balance = ?, version = version + 1
WHERE id = 1 AND version = ?;
-- check rows affected: 0 means someone else updated, retryOtimista com updated_at
A mesma ideia, usando updated_at em vez de uma coluna de versão explícita:
UPDATE accounts
SET balance = ?, updated_at = NOW()
WHERE id = ? AND updated_at = ?;
-- If updated_at has changed in the meantime, 0 rows affected — retry.Vantagens e desvantagens do bloqueio otimista
Vantagens: alta concorrência, sem espera.
Desvantagens: as gravações podem falhar e exigir lógica de repetição; o conflito só aparece no momento do UPDATE.
Quando escolher o pessimista
Para:
- Transações curtas com alta contenção em linhas muito disputadas
- Transferências de dinheiro — não se deseja trabalho parcial
- Operações de longa duração nas quais um conflito é provável
Quando escolher o otimista
Para:
- Cargas de trabalho predominantemente de leitura, com conflitos raros
- APIs sem estado, nas quais o cliente mantém a linha entre as solicitações
- Edições em dispositivos móveis ou off-line seguidas de sincronização
Híbrido: FOR UPDATE NOWAIT
Tente bloquear; se estiver bloqueada, falhe imediatamente e permita que o usuário tente novamente:
SELECT * FROM accounts WHERE id = 1 FOR UPDATE NOWAIT;
-- ERROR if someone else holds it — user sees a friendly retry messageBloqueios consultivos
Bloqueios no nível da aplicação que não estão vinculados a nenhuma linha:
SELECT pg_try_advisory_xact_lock(hashtext('order:42'));
-- True if you got the lock, false otherwise — useful for cross-row coordination.Não se esqueça de indexar os alvos dos bloqueios
FOR UPDATE sem um índice na coluna usada em WHERE pode bloquear mais linhas do que o esperado (bloqueia as linhas examinadas, não apenas as correspondentes).
Tempos limite de bloqueio
Defina lock_timeout para evitar esperar indefinidamente:
SET lock_timeout = '5s';
BEGIN;
SELECT * FROM accounts WHERE id = 1 FOR UPDATE;
-- ERROR if lock not acquired in 5 secondsRecapitulação
O bloqueio pessimista bloqueia a linha; o otimista verifica no momento da gravação.
- Pessimista: FOR UPDATE — simples, mas reduz a concorrência
- Otimista: coluna de versão — permite mais concorrência, mas exige repetição
- Escolha de acordo com a carga de trabalho; combine as estratégias quando necessário
Verificação rápida
Uma redução de estoque em comércio eletrônico sofre muita contenção. Qual estratégia de bloqueio geralmente é mais segura?
Perguntas Frequentes
A aula “Bloqueio otimista vs pessimista” é grátis?
Sim — o texto completo de “Bloqueio otimista vs pessimista” é grátis para ler aqui na web. Para praticá-la interativamente (um editor de código integrado e um tutor de IA 24/7) e desbloquear o restante do curso de SQL Academy, atualize para CoddyKit PRO. O curso de SQL Academy inclui 4 aulas no total.
O que vou aprender em “Bloqueio otimista vs pessimista”?
Compare os padrões SELECT ... FOR UPDATE (pessimista) e coluna de versão / WHERE updated_at = ? (otimista). Você pratica SQL Academy com código prático que executa diretamente no navegador, e um tutor de IA 24/7 responde suas dúvidas enquanto trabalha na aula.
Preciso ter experiência prévia para começar SQL Academy?
Nenhuma experiência prévia é necessária. SQL Academy no CoddyKit é estruturado para alunos iniciantes até avançados, então você pode começar aqui ou desde o início e aprender no seu ritmo. Esta é a aula 4 de 4.
Quanto tempo leva a aula “Bloqueio otimista vs pessimista”?
A maioria das aulas CoddyKit leva cerca de 5–10 minutos. Cada uma é compacta e interativa, então você faz progresso constante e retoma exatamente de onde parou entre web e app.
Posso escrever e executar código nesta aula de SQL Academy?
Sim. Cada aula de SQL Academy inclui um editor de código integrado, então você escreve e executa código real direto no navegador e recebe feedback de IA instantaneamente — nenhuma configuração local necessária.
Todas as aulas deste curso
- Propriedades ACID e anomalias
- Níveis de isolamento: READ COMMITTED, REPEATABLE READ, SERIALIZABLE
- Interbloqueios: detecção e prevenção
- Bloqueio otimista vs pessimista