Задать вопрос
@DeOne
Программист

Yii2: Как выполнить добавление в одну таблицу с включенным режимом транзакции?

Здравствуйте. Есть добавление некоторых данных с разделением, вот пример:
asddasd|asdasd|hhasd|sadasd
hhsadasd|hhjaskdkasd|asdlasd

То есть просто несколько строчек, которые нужно добавить в одну таблицу.
Реализовано так, но не работает:

$data = explode("\n", $this->data);
        $transaction = $this->getDb()->beginTransaction();
        try {        
            for ($i=0; $i<count($data ); $i++) {
                $array= explode("|", $data[$i]);
                    $this->login = $array[0];
                    $this->password = (isset($array[1])) ? $array[1] : '';
                    $this->proxy = (isset($array[2]) && isset($array[3])) ? $array[2].$array[3] : '';
                    if (!$this->save()) {
                        $transaction->rollBack();
                        foreach ($this->firstErrors as $key => $value) break;
                        if (empty($value)) $value = 'Неизвестная ошибка';
                        return array('message' => $value, 'status' => false);        
                    }
                #}
            }
            $transaction->commit();            
        } catch(\Exception $e) {
            $transaction->rollBack();
            throw $e;
        }
  • Вопрос задан
  • 222 просмотра
Подписаться 2 Оценить Комментировать
Пригласить эксперта
Ответы на вопрос 2
Это
$transaction->rollBack();
    foreach ($this->firstErrors as $key => $value) break;
    if (empty($value)) $value = 'Неизвестная ошибка';
    return array('message' => $value, 'status' => false);

заменяем на что-то, типа этого
throw new HttpException(500, 'Неизвестная ошибка');

А уже в catch'а делаете свои проверки и генерируете сообщения от ошибке, если нужно.
И все должно работать.
Ответ написан
ppokrovsky
@ppokrovsky
Конструкция try-catch предполагает, что в блоке try одна из операций может бросить исключение, которое будет обработано блоком catch. В Вашем коде ни одна из операций явно не бросает исключение, поэтому перехода к catch не происходит.

Транзакционность нужна прежде всего для поддержания консистентности данных, т.е. когда одна структура данных записывается несколькими методами в несколько таблиц и важно убедиться, что все операции записи были выполнены успешно, иначе данные будут неконсистентны.

В Вашем случае не очень понятно, для чего реализуется транзакционность.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы