CodeIgniter, руководство пользователя к версии 1.6.1


Транзакции

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

Вы можете ипользовать любое количество запросов между начальной и завершающей фунциями и они все будут либо выполнены, либо нет, в зависимости от того, будет ли выполнен или нет каждый из представленных запросов.

Строгий режим (Strict Mode)

По-умолчанию 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();

Когда транзакции отключенны, запросы автоматически завершаются, как если бы они выполнялись без использования транзакций.

Режим тестирования (Test Mode)

При желании можно перевести систему транзакций в «режим тестирования», в котором запросы откатываются даже, если они сгенерировали верный результат. Для использования режима тестирования, просто установите первый параметр функции $this->db->trans_start() в TRUE:

$this->db->trans_start(TRUE); // Будет происходить откат запросов
$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().