Транзакции
Абстракция базы данных CodeIgniter позволяет использовать транзакции с базами данных, которые поддерживают безопасные типы таблиц. В MySQL вам нужно использовать типы таблиц InnoDB или BDB, а не более распространённые MyISAM. Большинство других платформ баз данных поддерживают транзакции по умолчанию.
Если вы не знакомы с транзакциями, рекомендуем вам найти хороший онлайн-ресурс, чтобы узнать о них для вашей конкретной базы данных. Нижеприведённая информация предполагает, что у вас есть базовое понимание транзакций.
- Подход CodeIgniter к транзакциям
- Выполнение транзакций
- Жесткий режим
- Управление ошибками
- Отключение транзакций
- Режим тестирования
- Выполнение транзакций вручную
Подход CodeIgniter к транзакциям
CodeIgniter использует подход к транзакциям, очень похожий на процесс, используемый популярным классом базы данных ADODB. Мы выбрали этот подход, потому что он значительно упрощает процесс выполнения транзакций. В большинстве случаев достаточно двух строк кода.
Традиционно для реализации транзакций требуется немало работы, поскольку они требуют отслеживания ваших запросов и определения, нужно ли выполнять коммита или откат, в зависимости от успешного или неудачного выполнения ваших запросов. Это особенно неудобно при вложенных запросах. В отличие от этого, мы реализовали интеллектуальную систему транзакций, которая выполняет всё это автоматически (вы также можете управлять своими транзакциями вручную, если хотите, но пользы от этого нет).
Выполнение транзакций
Для выполнения ваших запросов с использованием транзакций вы будете использовать функции $this->db->transStart() и $this->db->transComplete() следующим образом:
$this->db->transStart();
$this->db->query('AN SQL QUERY...');
$this->db->query('ANOTHER QUERY...');
$this->db->query('AND YET ANOTHER QUERY...');
$this->db->transComplete();
Вы можете выполнять любое количество запросов между функциями start/complete, и все они будут подтверждены или отменены в зависимости от успешности или неудачи любого конкретного запроса.
Жесткий режим
По умолчанию CodeIgniter выполняет все транзакции в жёстком режиме. Когда режим strict включён, если одна группа транзакций завершается неудачно, все группы будут отменены. Если жёсткий режим выключен, каждая группа обрабатывается независимо, то есть неудача одной группы не повлияет на другие.
Жесткий режим может быть выключен следующим образом:
$this->db->transStrict(false);
Управление ошибками
Если в вашем файле Config/Database.php включена обработка ошибок, вы увидите стандартное сообщение об ошибке, если коммит не удался. Если отладка отключена, вы можете управлять своими ошибками следующим образом:
$this->db->transStart();
$this->db->query('AN SQL QUERY...');
$this->db->query('ANOTHER QUERY...');
$this->db->transComplete();
if ($this->db->transStatus() === false) {
// generate an error... or use the log_message() function to log your error
}
Отключение транзакций
Транзакции включены по умолчанию. Если вы хотите отключить транзакции, вы можете сделать это, используя $this->db->transOff():
$this->db->transOff();
$this->db->transStart();
$this->db->query('AN SQL QUERY...');
$this->db->transComplete();
Когда транзакции отключены, ваши запросы будут автоматически подтверждены, как и при выполнении запросов без транзакций.
Режим тестирования
Вы можете (по желанию) перевести систему транзакций в «режим тестирования», который заставит ваши запросы отменяться — даже если запросы производят действительный результат. Для использования режима тестирования просто установите первый параметр в функции $this->db->transStart() в значение true:
$this->db->transStart(true); // Query will be rolled back
$this->db->query('AN SQL QUERY...');
$this->db->transComplete();
Выполнение транзакций вручную
Если вы хотите выполнить транзакции вручную, вы можете сделать это следующим образом:
$this->db->transBegin();
$this->db->query('AN SQL QUERY...');
$this->db->query('ANOTHER QUERY...');
$this->db->query('AND YET ANOTHER QUERY...');
if ($this->db->transStatus() === false) {
$this->db->transRollback();
} else {
$this->db->transCommit();
}
Примечание
Убедитесь, что вы используете $this->db->transBegin() при выполнении ручных транзакций, а не $this->db->transStart().
© 2014–2020 British Columbia Institute of Technology
Licensed under the MIT License.
https://codeigniter.com/user_guide/database/transactions.html