Мне нужно выполнить запрос вне транзакции, которую я начал:
$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;
}
Есть ли разумный способ сделать это, или мне нужно клонировать / создать новое соединение с базой данных - и если да, то как лучше всего это сделать без необходимости снова указывать параметры базы данных и просто использовать ту же конфигурацию?
В чем причина запроса вне транзакции? Вы можете получить данные до начала транзакции.






Вам необходимо использовать отдельное соединение или переместить этот запрос после / до транзакции.
Для копирования компонента БД вы можете просто использовать clone - новый экземпляр должен открывать новое соединение по первому запросу:
$connection = clone Yii::$app->db;
$connection->createCommand("INSERT INTO...")->execute();
Таким образом он используется в yii\log\DbTarget.
Но вы можете рассмотреть возможность объявления отдельного компонента БД для этой задачи (Yii::$app->db2) - тогда вы сможете повторно использовать это дополнительное соединение.
Будет ли транзакция клонирована?
@robsch Нет, это откроет новое соединение без активной транзакции. Компонент Connection также сбросит внутреннюю информацию об активных транзакциях: github.com/yiisoft/yii2/blob/…