Concorrência e isolamento

Escalonamentos, serialização, leituras sujas, fantasmas, atualizações perdidas e snapshots.

TLDR

Perguntar sobre esta página

ChatGPTClaudePerplexityGrokGeminiCopiar e abrirDeepSeekCopiar e abrir

Anomalias a reconhecer

Um escalonamento intercala operações respeitando a ordem interna de cada transação. É serial se uma acaba antes da seguinte; serializável se equivale a alguma ordem serial.

AnomaliaSinal a detetar
Atualização perdidaDuas leituras de 10 e duas escritas de 9: duas vendas, uma unidade retirada.
Leitura sujaUsa valor ainda não confirmado, depois anulado por rollback.
Leitura não repetívelA mesma linha muda entre duas leituras, por commit alheio.
FantasmaO conjunto que satisfaz o predicado muda entre contagens.

SET stock = stock - 1 WHERE stock >= 1, conferindo linhas afetadas, evita o padrão ler-calcular-escrever no cliente. Regras entre várias linhas pedem proteção própria.

Testar por conflitos

Duas operações de transações diferentes conflitam se tocam no mesmo item e pelo menos uma escreve. No grafo, Ti→TjT_i\to T_j quando a operação de TiT_i precede a conflitante de TjT_j.

Acíclico se e só se serializável por conflitos; uma ordem topológica dá a ordem serial equivalente. O critério é mais restrito que outras equivalências por observação.

r1(X), r2(X), w1(X), w2(X) tem ciclo; r1(X), w1(X), r2(X), w2(X) só exige T1 antes de T2.

Mecanismos e limites

  • Bloqueio em duas fases: adquire tudo antes de começar a libertar; sob as hipóteses, garante serializabilidade por conflitos. Deadlock (T1 segura A espera B; T2 o inverso) pede deteção e repetição da transação inteira com leituras novas.
  • MVCC: versões para snapshots coerentes sem bloquear todas as escritas. Snapshot estável não prova serializabilidade.
Write skew numa regra conjunta. Ana e Rui estão de serviço. Duas transações veem ambos no mesmo snapshot e retiram pessoas diferentes, deixando zero. Em qualquer ordem serial correta, a segunda vê apenas uma pessoa e recusa a saída. Este modelo não simula SQLite.

Write skew quebra uma regra entre linhas sem leitura suja nem escrita sobreposta: protege o conjunto com isolamento serializável e repetição, ou bloqueios que cubram a regra. Bloquear só a linha alterada pode não bastar.

O que cada motor dá

Os nomes SQL proíbem sujas (Read committed), sujas e não repetíveis (Repeatable read), e ainda fantasmas (Serializable). Evitar as três não prova serializabilidade total; o motor pode dar mais que o mínimo.

  • PostgreSQL: Read committed com snapshot por instrução. Repeatable read com snapshot estável, sem os fantasmas descritos, mas admite write skew. Serializable aborta em conflito de serialização; repete tudo. SELECT ... FOR UPDATE bloqueia linhas, sem provar regras genéricas.
  • SQLite: um escritor de cada vez. Em WAL, leitores mantêm snapshots durante escritas. Promover leitura antiga a escrita pode falhar com SQLITE_BUSY_SNAPSHOT; termina e repete. BEGIN IMMEDIATE reserva cedo a escrita. Entre ligações, impede leituras não confirmadas; read_uncommitted em cache partilhada é a exceção. Uma só ligação não demonstra concorrência.

Garantias concretas dos motores.

À tua maneira

Aparência

Modo de cor
Tema
Cor de destaque

Leitura

Fonte de leitura

Álgebra, lógica e uma ideia de cada vez.

Código

Fonte do código

Navegação

Cursor de leitura, sem edição. h, j, k, l movem; / pesquisa nesta página. v seleciona caracteres; V seleciona linhas; y copia. Tab permite destacar ou comentar. Espaço ou Enter abre blocos recolhíveis. Nos cartões, h, j, k, l mudam o foco.

CSS personalizado

Ativa uma sugestão ou guarda o teu CSS. Só muda este navegador.

Usa --page, --text e --accent para acompanhar o tema.

Seletores e recuperação

.site-header, .prose, .course-card, [data-reading-history], [data-playground] e .page-actions.

Abre a aparência com a tecla vírgula ou no rodapé. Se o CSS esconder os controlos, abre esta página sem CSS personalizado.

Pesquisar

Escreve para pesquisar em todo o site.

para escolher · Enter para abrir · Esc para fechar

Copiar fórmula

A cópia automática não está disponível. Copia o LaTeX abaixo.

Pesquisar nesta página

Enter procura · n / N repetem · Esc cancela. Ctrl / Cmd K pesquisa todo o site.

Atalhos de teclado

Clica numa tecla para a mudar. Esc cancela. Backspace desativa.

PesquisarCtrl / Cmd K

Os atalhos não interferem enquanto escreves. Tab e Enter funcionam sempre.