Spec-Zone.ru › CodeIgniter 3

Транзакции

Абстракция базы данных 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 выполняет все транзакции в режиме жёсткого режима. Когда жёсткий режим включен, если одна группа транзакций завершается неудачно, все группы будут отменены. Если жёсткий режим отключён, каждая группа обрабатывается независимо, то есть неудача одной группы не повлияет на другие.

Жесткий режим может быть отключён следующим образом:

$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)
{
        // generate an error... or use the log_message() function to log your error
}

Отключение транзакций

Если вы хотите отключить транзакции, вы можете сделать это, используя $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().

© 2014–2020 British Columbia Institute of Technology
Licensed under the MIT License.
https://codeigniter.com/userguide3/database/transactions.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API