Compreender o conceito
Uma transação permite tratar alterações relacionadas na base de dados como uma unidade, segundo as garantias do motor. Com PDO, iniciar, confirmar e reverter são decisões explícitas. Uma exceção não garante, por si só, que o código da aplicação chamou rollback. DDL e drivers podem ter comportamentos específicos que precisam de confirmação.
Aplicar e decidir
Não incluas chamadas lentas desnecessárias dentro de uma transação que retém recursos. Um email enviado não é desfeito por rollback SQL. Quando o resultado precisa de provocar trabalho externo, um registo de outbox na mesma transação pode permitir processamento posterior controlado. Verifica concorrência e duplicação; beginTransaction não resolve automaticamente todos esses problemas.
Aplicação guiada no trabalho
Num serviço fictício, confirmar uma encomenda implica também guardar um evento de auditoria. Se ambos pertencem à mesma base transacional, uma transação pode confirmar ou reverter as duas escritas DML. Controla o tratamento de erro e não assumes que qualquer exceção executa o rollback esperado pelo teu código. DDL tem regras próprias: em MySQL, instruções como CREATE TABLE podem provocar commit implícito. Um email enviado continua fora do âmbito do rollback SQL. Uma outbox guarda alteração e intenção de envio na mesma transação; um worker faz o envio depois. Se o worker falhar entre entrega e marcação, pode repetir. Preserva identidade do evento, define consumo idempotente e monitoriza pendentes. Uma transação não deve ficar aberta à espera de chamadas externas lentas sem avaliar os locks e recursos retidos.
Atualizar o pedido e gravar o evento de outbox na mesma transação evita confirmar só metade dessa intenção na base de dados.
Armadilhas comuns
Misturar DDL sem rever commit implícito; assumir rollback de efeitos externos; prometer entrega única só com outbox.
Tópicos relacionados: HTTP, sessões e autorização por recurso · Tipos e comparações explícitas
A transação tem um âmbito; efeitos externos precisam de estratégia própria.
Referência: PHP manual: Transactions and auto-commit · PHP 8.5 reference; DR PHP 2026.3; new fixtures executed on PHP 8.4.4 / SQLite 3.51.2