【问题标题】:Yii2: Execute query outside transaction?Yii2:在事务外执行查询?
【发布时间】:2018-08-15 11:08:38
【问题描述】:

我需要在已启动的事务之外运行查询:

$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;
}

有没有一种聪明的方法可以做到这一点,或者我是否需要克隆/创建一个新的数据库连接 - 如果是这样,最好的方法是什么,而不必再次指定数据库参数,只需使用相同的配置?

【问题讨论】:

标签: php mysql transactions yii2


【解决方案1】:

您需要使用单独的连接或在事务之后/之前移动此查询。

对于复制数据库组件,您可以简单地使用clone - 新实例应在第一次查询时打开新连接:

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

yii\log\DbTarget中就是这样使用的。

但您可以考虑为此任务声明单独的 DB 组件 (Yii::$app->db2) - 然后您将能够重用这个额外的连接。

【讨论】:

  • 交易也会被克隆吗?
  • @robsch 不,这将打开没有任何活动事务的新连接。 Connection 组件还将重置有关活动事务的内部信息:github.com/yiisoft/yii2/blob/…
猜你喜欢
  • 2015-07-16
  • 2017-10-10
  • 1970-01-01
  • 2012-07-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-19
相关资源
最近更新 更多