Транзакции
Абстрация CodeIgniter БД позволяет вам использовать транзакции с базами данных, которые поддерживают транзакционные типы таблиц. Для MySQL необходимо запустить типы таблиц InnoDB или BDB, но не MyISAM. Большинство других движков БД поддерживают транзакции «из коробки».
Если вы не знакомы с транзакциями, мы рекомендуем вам найти хорошие онлайновые ресурсы, и изучить их природу и использование для вашей конкретной базы данных. Информация ниже подразумевает, что вы понимаете механизм транзакций.
Подход CodeIgniter к транзакциям
CodeIgniter использует подход к транзакциям, который очень похож на процесс, используемый популярным классом ADODB. Мы выбрали этот подход, потому что он великолепно упрощает процесс запуска транзакций. В большинстве случаев достаточно пары строк кода.
Традиционно транзакции требуют достаточно много работы для реализации, чтобы отслеживать запросы и определять коммиты и откаты, в зависимости от успешности или неудачи ваших запросов. Это особенно громоздко с вложенными запросами. Напротив, мы реализовали интеллектуальную систему транзакций, которая делает все автоматически. Также вы можете управлять операциями вручную, если пожелаете, но на самом деле в этом нет никакой пользы.
Запуск транзакций
Чтобы запустить ваши запросы в транзакциях, вам потребуются функции $this->db->trans_start() и $this->db->trans_complete(), как показано ниже:
$this->db->trans_start();
$this->db->query('AN SQL QUERY...');
$this->db->query('ANOTHER QUERY...');
$this->db->query('AND YET ANOTHER QUERY...');
$this->db->trans_complete();
Вы можете запустить множество запросов, сколько пожелаете от старта до финиша и все они будут совершены или откачены, на основе успеха или неудачи любого из заданных запросов.
Строгий режим
По умолчанию CodeIgniter запускает все транзакции в строгом режиме. Когда строгий режим включен, если вы запускаете множественные группы транзакций, если хотя бы одна группа не срабатывает, то все будут откачены. Если строгий режим выключен, каждая группа будет обрабатываться независимо. Неудача одной группы не будет оказывать влияние на работу других.
Строгий режим может быть выключен следующим образом:
$this->db->trans_strict(FALSE);
Управление ошибками
Если вы включили отображение ошибок в config/database.php, вы увидите стандартные сообщения об ошибках, если коммит был неуспешен. Если отладка выключена, вы можете управлять вашими собственными ошибками, вот так:
$this->db->trans_start();
$this->db->query('AN SQL QUERY...');
$this->db->query('ANOTHER QUERY...');
$this->db->trans_complete();
if ($this->db->trans_status() === FALSE)
{
// генерирует ошибку, или используйте функцию log_message() для логгирования
}
Включение транзакций
Транзакции автоматически включаются в момент использования $this->db->trans_start(). Если вы хотите выключить транзакции, сделайте $this->db->trans_off():
$this->db->trans_off()
$this->db->trans_start();
$this->db->query('AN SQL QUERY...');
$this->db->trans_complete();
Когда транзакции выключены, ваши запросы будут автоматически выполнены (auto-commited), как обычные запросы вне транзакций.
Тестовый режим
Вы можете опционально включить систему транзакций в «тестовый режим», который будет откатывать все запросы, даже если они будут возвращать корректные результаты. Чтобы использовать тестовый режим, просто установите первый параметр функции $this->db->trans_start() в TRUE:
$this->db->trans_start(TRUE); // Query will be rolled back
$this->db->query('AN SQL QUERY...');
$this->db->trans_complete();
Ручной запуск транзакций
Если вы хотите управлять транзакциями вручную, вы можете сделать так:
$this->db->trans_begin();
$this->db->query('AN SQL QUERY...');
$this->db->query('ANOTHER QUERY...');
$this->db->query('AND YET ANOTHER QUERY...');
if ($this->db->trans_status() === FALSE)
{
$this->db->trans_rollback();
}
else
{
$this->db->trans_commit();
}
Примечание: Убедитесь в том, что вы используете $this->db->trans_begin() когда вручную управляете транзакциями, а не $this->db->trans_start().