Транзакции
Абстракции базы данных 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_off()
:
$this->db->trans_off();
$this->db->trans_start();
$this->db->query('AN SQL QUERY...');
$this->db->trans_complete();
Когда транзакции отключены, ваши запросы будут приняты автоматически, игнорируя любые вызовы trans_start()
, trans_complete()
и т.д.
Режим тестирования
Также можно поставить систему транзакций в “режим тестирования”, который будет откатывать вашим запросам, даже если у запросов действительный результат. Чтобы использовать этот режим, достаточно установить первым параметром функции $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().