Como você observou, o mecanismo padrão de tratamento de transações no CodeIgniter requer reversão manual em caso de erros ocorrendo dentro de funções externas. Para resolver esse problema, recomenda-se uma abordagem mais abrangente.
1. Encapsulando o tratamento de transações em um modelo:
De acordo com a arquitetura do CodeIgniter, as operações do banco de dados devem ser encapsuladas dentro da classe Model. Isso garante o tratamento adequado dos dados e a separação do model-view-controller (MVC). Funções externas devem servir apenas como utilitários ou auxiliares.
2. Captura de erros em funções externas:
Em funções externas, como insert_function e update_function2, implemente o tratamento de erros e retorne FALSE se ocorrer um erro. Isso acionará a reversão automática quando a transação for concluída.
Exemplo:
public function insert_function($data)
{
if (!$this->db->insert('transactions_exercices', $data)) {
return FALSE;
}
return TRUE;
}
3. Tratamento de exceções no controlador:
No controlador, onde a transação é iniciada, trate quaisquer exceções que possam surgir durante a transação e execute as ações necessárias, como exibir mensagens de erro ou registrar exceções.
Exemplo:
try {
$this->db->trans_start();
// Call external functions
$result1 = $this->utils->insert_function($data);
$result2 = $this->utils->update_function2($test);
if ($result1 === FALSE || $result2 === FALSE) {
throw new Exception('An error occurred.');
}
$this->db->trans_complete();
} catch (Exception $e) {
$this->db->trans_rollback();
// Handle the exception...
}
Observação: Certifique-se de que o modo estrito esteja desabilitado na configuração da sua transação para permitir grupos de transações independentes, conforme mencionado na solução fornecida.
Solução alternativa:
Como alternativa, você pode definir uma classe de transação personalizada que lida com interceptação de erros e reversão automática. Essa abordagem pode fornecer tratamento central de erros para todas as transações.
Isenção de responsabilidade: Todos os recursos fornecidos são parcialmente provenientes da Internet. Se houver qualquer violação de seus direitos autorais ou outros direitos e interesses, explique os motivos detalhados e forneça prova de direitos autorais ou direitos e interesses e envie-a para o e-mail: [email protected]. Nós cuidaremos disso para você o mais rápido possível.
Copyright© 2022 湘ICP备2022001581号-3