0Pricing
SQL Academy · Aula

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 UPDATE

Vantagens 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, retry

Otimista 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 message

Bloqueios 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 seconds

Recapitulaçã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

  1. Propriedades ACID e anomalias
  2. Níveis de isolamento: READ COMMITTED, REPEATABLE READ, SERIALIZABLE
  3. Interbloqueios: detecção e prevenção
  4. Bloqueio otimista vs pessimista
← Voltar para SQL Academy