Как вы заметили, механизм обработки транзакций по умолчанию в CodeIgniter требует ручного отката в случае ошибок, возникающих во внешних функциях. Для решения этой проблемы рекомендуется более комплексный подход.
1. Инкапсуляция обработки транзакций в модели:
Согласно архитектуре CodeIgniter, операции с базой данных должны быть инкапсулированы в класс модели. Это обеспечивает правильную обработку данных и разделение модели, представления и контроллера (MVC). Внешние функции должны служить только утилитами или помощниками.
2. Перехват ошибок во внешних функциях:
Внутри внешних функций, таких как Insert_function и update_function2, реализуйте обработку ошибок и возвращайте FALSE в случае возникновения ошибки. Это вызовет автоматический откат после завершения транзакции.
Пример:
public function insert_function($data)
{
if (!$this->db->insert('transactions_exercices', $data)) {
return FALSE;
}
return TRUE;
}
3. Обработка исключений в контроллере:
В контроллере, где инициируется транзакция, обрабатывайте любые исключения, которые могут возникнуть во время транзакции, и выполняйте необходимые действия, такие как отображение сообщений об ошибках или регистрация исключений.
Пример:
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...
}
Примечание: Убедитесь, что строгий режим отключен в конфигурации вашей транзакции, чтобы разрешить независимые группы транзакций, как указано в предоставленном решении.
Альтернативное решение:
В качестве альтернативы вы можете определить собственный класс транзакций, который обрабатывает перехват ошибок и автоматический откат. Этот подход может обеспечить централизованную обработку ошибок для всех транзакций.
Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.
Copyright© 2022 湘ICP备2022001581号-3