在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;');
答案 0 :(得分:4)
自\yii\db\Connection::beginTransaction()
拨打\yii\db\Transaction::begin()
之后就无需拨打PDO::beginTransaction()
,而PDO::commit()
会调用PDO::rollback()
:
关闭自动提交模式。
提交事务,将数据库连接返回到自动提交模式,直到下一次调用
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
]
],
],