← SQL: perguntas melhores aos dados
06 / 11 · 22 MIN

Concorrência e atualização segura

Evita perder alterações e distingue transação de repetição segura.

Compreender o conceito

Duas sessões podem ler o mesmo estado e produzir atualizações concorrentes. Uma transação não elimina automaticamente todas as anomalias; isolamento e padrão de acesso importam. Controlo otimista pode incluir uma versão no predicado de UPDATE e verificar quantas linhas foram alteradas. Zero linhas exige tratar conflito, não assumir sucesso.

Aplicar e decidir

Uma restrição UNIQUE pode ajudar a impedir duplicados para uma chave apropriada. O desenho deve definir o significado dessa chave e como responder a repetição. Rerun seguro também depende de efeitos externos. Após uma falha de comunicação no commit, o cliente pode não saber se a transação confirmou; consultar estado por uma chave estável pode ser necessário.

Aplicação guiada no trabalho

Para editar um ticket, guarda a versão lida e atualiza apenas quando ID e versão continuam a corresponder, incrementando a versão na mesma escrita. Verifica o número de linhas afetadas: zero exige avaliar ausência ou conflito, não devolver sucesso nem retirar a proteção. Todos os caminhos de escrita têm de participar no protocolo. Para operações que bloqueiam várias linhas, uma ordem consistente ajuda a reduzir deadlocks; prevê tratamento de aborto e retry limitado da transação completa. Em Read Committed, duas leituras podem observar confirmações ocorridas entre instruções. Escolhe isolamento segundo a regra, em vez de assumir que BEGIN congela todas as leituras. Se perderes a resposta de COMMIT, reconcilia pela chave estável e confirma efeitos externos separadamente antes de repetir.

NA PRÁTICA

UPDATE tasks SET status = :status, version = version + 1 WHERE id = :id AND version = :expected; o consumidor verifica o número de linhas e trata conflitos.

Armadilhas comuns

Ignorar zero linhas; repetir após COMMIT incerto com uma chave nova; manter locks durante interação humana.

Tópicos relacionados: Consultar com intenção · Juntar sem multiplicar enganos

Leva esta ideia contigo

Concorrência e repetição precisam de critérios observáveis, não apenas de BEGIN e COMMIT.

Criar conta

Referência: PostgreSQL 18: Transaction isolation · PostgreSQL 18 reference semantics; DR SQL 2026.4; synthetic plan metrics and portable SQLite 3.51.2 examples