FNSP Web Page

Transações: o que ACID quer dizer quando o código corre

Uma transferência bancária são duas operações: tirar de uma conta e pôr noutra. Se o processo morre entre as duas, o dinheiro desapareceu. É o exemplo de sempre, e explica para que serve uma transação.

BEGIN;
UPDATE contas SET saldo = saldo - 100 WHERE id = 1;
UPDATE contas SET saldo = saldo + 100 WHERE id = 2;
COMMIT;

Ou acontecem as duas, ou não acontece nenhuma. É a primeira letra do ACID — atomicidade — e é a que toda a gente conhece.

1. A letra que morde: isolamento

Duas transações ao mesmo tempo veem o quê uma da outra? É aqui que aparecem os bugs que não se reproduzem.

// Duas pessoas votam no mesmo instante
const artigo = await db.artigos.findUnique({ where: { id } }); // votos: 10
await db.artigos.update({ where: { id }, data: { votos: artigo.votos + 1 } });

As duas leram 10. As duas escreveram 11. Um voto perdeu-se, e ninguém dá por isso — chama-se lost update, e resolve-se não lendo para escrever:

-- A base faz a conta, e ninguém lê nada
UPDATE artigos SET votos = votos + 1 WHERE id = 42;

Quando é mesmo preciso ler antes de decidir, a linha bloqueia-se:

SELECT saldo FROM contas WHERE id = 1 FOR UPDATE;

2. Curtas, sempre

Uma transação segura recursos. Enquanto está aberta, as linhas que tocou ficam bloqueadas para quem lá quiser mexer.

// Nunca. Um serviço externo lento deixa a base bloqueada com ele.
await db.$transaction(async (tx) => {
  await tx.encomendas.create({ data });
  await enviarEmailDeConfirmacao(); // uma chamada HTTP, aqui dentro
});

O que é da base fica na transação; o resto acontece depois de o COMMIT passar.

3. As outras duas letras

  • Consistência — no fim, as regras da base continuam válidas: chaves estrangeiras, restrições, índices únicos. Uma transação que as viole não passa.

  • Durabilidade — depois de o COMMIT devolver, aquilo está em disco. Se a máquina se desligar no instante seguinte, os dados lá estão.

O nível de isolamento por omissão no Postgres é READ COMMITTED: cada consulta vê o que já foi comitado, e nunca vê trabalho a meio de outra transação. Serve para quase tudo — e para o que não serve, existe o SERIALIZABLE, mais lento e mais seguro.

Comentários

Ainda ninguém comentou este artigo.

Voltar ao blog

Gostávamos de saber quantas pessoas visitam o site, com o Google Analytics. Sem a sua autorização não corre nada. Política de Privacidade.