CodeIgniter User Guide Version 2.0.0


Транзакции

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

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

Строгий режим

По умолчанию CodeIgniter запускает все транзакции в строгом режиме (Strict Mode). Когда строгий режим включен, если вы запустили много групп транзакций, при неудаче в одной группе, все остальные группы также будут откатаны. Если строгий режим выключен, каждая группа выполняется независимо, подразумевая, что неудача в выполнении одной группы не повлияет на другие.

Строгий режим может быть выключен так:

$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().