Транзакции  

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