Yii2:如何在事务中禁用/启用自动提交模式?

时间:2016-07-13 09:54:09

标签: yii2

在Yii 1.1中,类CDbConnection中存在属性autoCommit。在Yii2中,类Connection中没有这样的属性。如何在事务中禁用和启用自动提交模式?或者我应该简单地使用以下方法:

$db->query('SET autocommit=0;');
$transaction = $db->beginTransaction();
try {
    $model->save();
    ...
    $transaction->commit();
} catch(Exception $e) {
    $transaction->rollback();
}
$db->query('SET autocommit=1;');

1 个答案:

答案 0 :(得分:4)

\yii\db\Connection::beginTransaction()拨打\yii\db\Transaction::begin()之后就无需拨打PDO::beginTransaction(),而PDO::commit()会调用PDO::rollback()

  

关闭自动提交模式。

另外\yii\db\Connection::$pdo

  

提交事务,将数据库连接返回到自动提交模式,直到下一次调用PDO::beginTransaction()开始新事务。

同样适用于PDO::setAttribute()

  

如果数据库设置为自动提交模式,则此功能将在回滚事务后恢复自动提交模式。

但是,您可以通过访问pdo对象\yii\db\Connection::$attributes并使用read-only mode直接设置PDO值:

$db->pdo->setAttribute(PDO::ATTR_AUTOCOMMIT, false);

您还可以使用write-only mode在初始化Yii::$app->db对象期间设置它们。在配置文件中:

'components' => [
    'db' => [
        'class' => '\yii\db\Connection',
        'dsn' => 'mysql:host=127.0.0.1;dbname=demo',
        'username' => 'root',
        'password' => '',
        'charset' => 'utf8',
        'attributes' => [
            PDO::ATTR_AUTOCOMMIT => false
        ]
    ],
],