Como trabalhar com transações no MySQL usando PHP?
As transações no MySQL garantem que um conjunto de operações ocorra de forma atômica, ou seja, todas as operações são concluídas com sucesso ou nenhuma delas é aplicada. Isso evita dados inconsistentes em situações críticas como pagamentos ou transferências bancárias.
Habilitando o Uso de Transações
O MySQL permite transações apenas em tabelas InnoDB, então primeiro precisamos garantir que nossa tabela suporta transações:
CREATE TABLE contas (
id INT AUTO_INCREMENT PRIMARY KEY,
usuario VARCHAR(100) NOT NULL,
saldo DECIMAL(10,2) NOT NULL
) ENGINE=InnoDB;
Criando uma Transação Simples com PDO
Aqui está um exemplo de uma transferência de saldo entre contas, garantindo que ambas as operações (débito e crédito) sejam executadas com sucesso antes de confirmar a transação.
<?php
try {
$conexao = new PDO("mysql:host=localhost;dbname=meu_banco", "usuario", "senha");
$conexao->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
// Iniciar transação
$conexao->beginTransaction();
// Debitar da conta de origem
$sql1 = "UPDATE contas SET saldo = saldo - 100 WHERE usuario = 'Alice'";
$conexao->exec($sql1);
// Creditar na conta de destino
$sql2 = "UPDATE contas SET saldo = saldo + 100 WHERE usuario = 'Bob'";
$conexao->exec($sql2);
// Confirmar transação
$conexao->commit();
echo "Transferência realizada com sucesso!";
} catch (Exception $e) {
// Reverter caso haja erro
$conexao->rollBack();
echo "Erro na transferência: " . $e->getMessage();
}
?>
Explicação do Código
beginTransaction()
: inicia a transação.exec()
: executa as operações de débito e crédito.commit()
: confirma as alterações no banco de dados.rollBack()
: reverte as operações se houver erro.
Por que usar transações no MySQL com PHP?
As transações são fundamentais para operações bancárias, sistemas financeiros e qualquer aplicação que necessite de garantia de integridade dos dados. Ao utilizar beginTransaction()
e commit()
, garantimos que todas as operações são concluídas com sucesso antes de serem aplicadas ao banco.
Algumas aplicações:
- Sistemas bancários e financeiros
- Plataformas de pagamento online
- Gerenciamento de pedidos em e-commerce
- Sistemas que realizam múltiplas atualizações simultâneas
Dicas para quem está começando
- Use transações apenas em tabelas InnoDB (MyISAM não suporta transações).
- Garanta que todas as operações dentro da transação sejam concluídas antes do
commit()
. - Utilize
rollBack()
para reverter a transação em caso de erro. - Evite deixar transações abertas por muito tempo para não sobrecarregar o banco.
- Se possível, utilize try/catch para capturar erros e evitar inconsistências.
Contribuições de Daniel Moreira