Как правильно провести транзакцию? - PullRequest
0 голосов
/ 17 мая 2019

У меня проблема с транзакцией в коде воспламенителя. Интересно, как правильно использовать транзакцию в этом случае:

foreach (items) {
   $this->db->trans_begin();

   addItemToArrayTotal_1();
   $items = getItem();
   if (items == null) {
      addItemToArrayTotal_2();
      if (!updateTask_1()) {
         addItemToArrayTotal_3();
      }
      continue;
   }
   if (updateTask_2()) {
      addItemToArrayTotal_4();
      if (!updateTask_3()) {
         addItemToArrayTotal_5();
      }
      if (updateTask_4()) {
         addItemToArrayTotal_6();
      }
   }
   addItemToArrayTotal_7();
}

- addItemToArrayTotal _? () - это просто интеграция функций с массивом, а не с данными. - updateTask _? () - это функции взаимодействия с данными.

Я хочу обработать один за другим элементы и произойдет откат в случае возникновения ошибки. Подскажите пожалуйста для меня как откатить данные?

1 Ответ

1 голос
/ 17 мая 2019

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

Пример:

$this->db->trans_start();
$this->db->insert(...);
$this->db->update(...);
$this->db->delete(...);
$this->db->trans_complete();
return $this->db->trans_status();

Если запрос на удаление завершится неудачно, запрос на обновление и вставку будет отменен.

В CodeIgniter вам не нужна никакая логика для обеспечения этого *, просто используйте trans_start() перед началом блока запроса, который вы хотите использовать для транзакций, и trans_complete() после.

* (если вы не совершаете транзакции вручную: https://www.codeigniter.com/user_guide/database/transactions.html#running-transactions-manually)

Чтобы обеспечить эту методологию, не отключайте trans_strict. https://www.codeigniter.com/user_guide/database/transactions.html#strict-mode

TL; DR следуйте этому примеру https://www.codeigniter.com/user_guide/database/transactions.html#managing-errors и все будет в порядке

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...