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

Mário LucasMário Lucas
3 min read

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! 😉

0
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

Mário Lucas
Mário Lucas