Travas de Nível de Linha
FOR UPDATE, SKIP LOCKED e padrões de fila. Orientações de produção para PostgreSQL.
Receita
BEGIN;
SELECT id FROM app.jobs WHERE status = 'queued' ORDER BY id FOR UPDATE SKIP LOCKED LIMIT 1;
COMMIT;Quando usar: Você implementa ou revisa SQL usando este conceito no PostgreSQL 18.
Exemplo de Trabalho
CREATE TABLE IF NOT EXISTS app.jobs (id bigint GENERATED ALWAYS AS IDENTITY PRIMARY KEY, status text NOT NULL);
INSERT INTO app.jobs (status) VALUES ('queued');O que isso demonstra:
- SQL idiomático do PostgreSQL 18
- Padrões adequados para revisão com EXPLAIN
- Padrões seguros para cargas de trabalho OLTP
Mergulho Profundo
Mecanismo
- O parser constrói a árvore de consulta.
- O executor executa os nós do plano.
- MVCC fornece isolamento de snapshot por instrução ou transação.
Prática
- Mantenha os exemplos legíveis.
- Teste com contagens de linhas realistas.
Armadilhas
- Transações longas - Bloqueiam o vacuum e aumentam o bloat. Correção: Faça COMMIT rapidamente; defina timeouts.
- Índices ausentes - Scans sequenciais sob carga. Correção: Indexe colunas de junção e filtro.
- Travas implícitas - Bloqueio inesperado. Correção: Use FOR UPDATE explícito quando necessário.
- Suposição incorreta de isolamento - Anomalias sob escritas concorrentes. Correção: Escolha o nível deliberadamente.
- Migrações não testadas - Trava DDL ou objetos inválidos. Correção: Prepare migrações com dados semelhantes aos de produção.
Alternativas
| Alternativa | Usar Quando | Não Usar Quando |
|---|---|---|
| Lógica em nível de aplicativo | CRUD simples | Integridade espalhada por serviços |
| Visão materializada | Leituras repetidas intensas | Complexidade de atualização |
| Processador de stream externo | Eventos entre sistemas | Superfície operacional extra |
FAQs
Isso se aplica a réplicas?
Réplicas somente leitura executam SELECT; escritas vão para o primário.
E o PgBouncer?
O pooling de transações afeta recursos em nível de sessão; use o modo de sessão quando necessário.
Relacionado
- Noções Básicas de Transações - BEGIN/COMMIT
Versões da Stack: Esta página foi escrita para PostgreSQL 18.4 (estável 18, manutenção 17), pgvector 0.8+, PgBouncer 1.x, Patroni 3.x e PostGIS 3.5+.