Dominando Transações no CodeIgniter 3: Porque Nem Sempre Roda de Primeira


Se tem uma coisa que todo dev já passou, é aquela sensação de fazer várias queries no banco e, no final, perceber que deu ruim em alguma delas. O problema? Algumas operações foram salvas, outras não, e agora o banco está mais bagunçado que um código sem indentação. Mas calma! No CodeIgniter 3, temos as transações para salvar o dia (e o banco de dados)!
Observação
Você verá a seguir utilização do $this→db→query(‘SQL…‘)
eu não recomendo, conforme o artigo que falo sobre Boas Práticas de Models, se não leu dê uma conferida. O intuito desse pequeno artigo é sobre transactions especificamente, então, solte as pedras, obrigado!
O Que São Transações?
Basicamente, uma transação permite agrupar várias operações do banco de dados em um só pacote. Se tudo correr bem, a gente confirma (commit). Se algo der errado, desfazemos tudo (rollback). Assim, evitamos dados inconsistentes e garantimos que o sistema não vire um pandemônio.
Mas atenção: para usar transações no MySQL, o tipo de tabela precisa ser InnoDB. Se estiver usando MyISAM, esquece transações e bora converter esse banco!
Como o CodeIgniter 3 Lida com Transações?
A galera do CodeIgniter 3 implementou um sistema de transações bem tranquilo, inspirado na popular biblioteca ADODB. O objetivo? Facilitar a vida e reduzir a quantidade de código repetitivo.
Agora, bora ver como rodar transações na prática!
O Básico das Transações no CodeIgniter 3
Tudo começa com $this->db->trans_start();
e termina com $this->db->trans_complete();
. Exemplo:
$this->db->trans_start();
$this->db->query("INSERT INTO usuarios (nome) VALUES ('João')");
$this->db->query("UPDATE contas SET saldo = saldo - 100 WHERE usuario_id = 1");
$this->db->trans_complete();
Se uma dessas queries falhar, nada será salvo. Se tudo correr bem, o commit acontece automaticamente. Fácil, né?
E Se Algo Der Errado? Tratando Erros
Se quiser um controle mais fino, dá para verificar se a transação deu certo:
$this->db->trans_start();
$this->db->query("INSERT INTO usuarios (nome) VALUES ('Maria')");
$this->db->query("UPDATE contas SET saldo = saldo - 50 WHERE usuario_id = 2");
$this->db->trans_complete();
if ($this->db->trans_status() === FALSE) {
// Algo deu errado, faz rollback e registra o erro
log_message('error', 'Erro na transação do banco!');
}
Se o commit falhar, dá para logar o erro e tomar uma ação. Nada de deixar o banco ao Deus-dará!
Modo Estrito: Quando o CI3 Fica Exigente
Por padrão, o CodeIgniter 3 usa Modo Estrito. Isso significa que se uma transação dentro de um grupo falhar, ele reverte tudo. Mas se quiser desativar esse comportamento e tratar cada grupo separadamente, basta fazer:
$this->db->trans_strict(FALSE);
Desativando Transações: Deixa Rolar (Não Recomendo, Mas Ok)
Se, por algum motivo, quiser desativar transações e deixar que cada query seja salva automaticamente, use:
$this->db->trans_off();
Assim, mesmo dentro de um bloco de transações, cada operação será confirmada no banco. Mas, sério, pensa bem antes de fazer isso! 🫣
Testando Sem Medo: Modo de Teste
Quer testar suas queries sem medo de bagunçar o banco? Use o modo de teste, que faz rollback automático:
$this->db->trans_start(true); // TRUE ativa o modo de teste
$this->db->query("DELETE FROM usuarios");
$this->db->trans_complete();
Assim, mesmo se a query for bem-sucedida, nada será salvo. Útil para testar sem comprometer os dados reais!
Controle Total: Gerenciando Transações Manualmente
Se preferir um controle manual, pode usar trans_begin()
, trans_commit()
e trans_rollback()
, como neste exemplo:
$this->db->trans_begin();
$this->db->query("INSERT INTO pedidos (usuario_id, valor) VALUES (3, 150.00)");
$this->db->query("UPDATE contas SET saldo = saldo - 150 WHERE usuario_id = 3");
if ($this->db->trans_status() === FALSE) {
$this->db->trans_rollback(); // Deu ruim? Cancela tudo!
} else {
$this->db->trans_commit(); // Tudo certo? Confirma!
}
Dessa forma, só fazemos o commit se todas as queries rodarem com sucesso. Caso contrário, jogamos tudo fora e evitamos inconsistências!
Conclusão
Usar transações no CodeIgniter 3 não só evita problemas no banco de dados, como também deixa o código mais seguro e confiável. Com apenas algumas linhas, conseguimos garantir que todas as operações sejam executadas juntas ou nenhuma seja salva.
Então, bora evitar aquele pesadelo de dados inconsistentes e começar a usar transações do jeito certo! 😉
Subscribe to my newsletter
Read articles from Mário Lucas directly inside your inbox. Subscribe to the newsletter, and don't miss out.
Written by
