Транзакции  

Абстракции базы данных 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().