Работа с БД: транзакции
- Автор mityok on сентября 11th, 2008
В CodeIgniter класс абстракции доступа к БД позволяет использовать транзакции для тех типов БД, которые их поддерживают. Для MySQL вам понадобится использовать типы таблиц InnoDB или BDB вместо обычного MyISAM. Остальные СУБД поддерживают транзакции непосредственно.
Если вы не знакомы с транзакциями, рекомендуется найти документацию по ним для вашей БД и ознакомиться. Информация на данной странице подразумевает, что вы понимаете основы транзакций.
Подход к транзакциям, используемый в CodeIgniter.
CodeIgniter использует подход к транзакциям, очень близкий к используемому в популярном класса абстракции доступа к БД ADODB. Данный подход был выбран, т.к. он значительно упрощает процедуру выполнения транзакций. В большинстве случаев для этого достаточно двух строк кода.
Обычно, транзакции требовали значительных трудозатрат, т.к. необходимо отслеживать ход выполнения запросов и определять, нужно ли подтвердить изменения (commit) или откатить их (rollback). Это довольно таки сложно при использовании вложенных запросов. В противоположность этому, в CodeIgniter реализована интеллектуальная система транзакций, которая автоматически выполняет эти действия. В то же время, вы можете вручну отслеживать ход выполнения запроса и управлять транзакциями, но какого-либо преимущества это вам не даст.
Выполнение транзакций
Для выполнения транзакции вам понадобятся функции $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, вы увидите стандартное сообщение об ошибке, если подтверждение изменений (commit) не было успешным. Если вывод сообщений об ошибках отключен, вы можете обрабатывать ошибки следующим образом:
$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();
Прмечание: когда транзакции отключены, ваши запросы будут автоматически подтверждаться, как при обычном режиме работы без транзакций.
Режим тестирования
Вы можете выполнять транзакции в "тестовом" режиме, при котором все команды будут автоматически отменены (rollback) даже при успешном выполнении всех запросов транзакции. Для этого просто установите первый параметр функции $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(); }
Примечание: убедитесь, что вы используете trans_begin() для ручного управления транзакциями, а НЕ trans_start()

Hi there, I dont know if I
Hi there, I dont know if I am writing in a proper board but I have got a problem with activation, link i receive in email is not working... http://www.codeigniter.org.ru/?9c7e3ba74cbea4f4b8f3bf90023,
Отправить комментарий