Yii2: выполнить запрос вне транзакции?

Мне нужно выполнить запрос вне транзакции, которую я начал:

$transaction = \Yii::$app->db->beginTransaction();
try {

    //... other database queries within the transaction ...

    //Query I want to be inserted regardless:
    \Yii::$app->db->createCommand("INSERT INTO...")->execute();

    $transaction->commit();
} catch (\Exception $e) {
    $transaction->rollBack();
    throw $e;
}

Есть ли разумный способ сделать это, или мне нужно клонировать / создать новое соединение с базой данных - и если да, то как лучше всего это сделать без необходимости снова указывать параметры базы данных и просто использовать ту же конфигурацию?

stackoverflow.com/questions/10585218/…
Reborn 14.05.2018 14:58

В чем причина запроса вне транзакции? Вы можете получить данные до начала транзакции.

robsch 14.05.2018 16:49
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
1
2
291
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вам необходимо использовать отдельное соединение или переместить этот запрос после / до транзакции.

Для копирования компонента БД вы можете просто использовать clone - новый экземпляр должен открывать новое соединение по первому запросу:

$connection = clone Yii::$app->db;
$connection->createCommand("INSERT INTO...")->execute();

Таким образом он используется в yii\log\DbTarget.

Но вы можете рассмотреть возможность объявления отдельного компонента БД для этой задачи (Yii::$app->db2) - тогда вы сможете повторно использовать это дополнительное соединение.

Будет ли транзакция клонирована?

robsch 14.05.2018 17:47

@robsch Нет, это откроет новое соединение без активной транзакции. Компонент Connection также сбросит внутреннюю информацию об активных транзакциях: github.com/yiisoft/yii2/blob/…

rob006 14.05.2018 17:49

Другие вопросы по теме