官方是這樣的
// $connection其實是數據庫連接
$transaction = $connection->beginTransaction(); try { $connection->createCommand($sql1)->execute(); $connection->createCommand($sql2)->execute(); // ... executing other SQL statements ... $transaction->commit(); } catch (Exception $e) { $transaction->rollBack(); }
其實可以這樣使用
$transaction = Yii::$app->db->beginTransaction(); try { // ... executing other SQL statements ... $transaction->commit(); } catch (\Exception $e) { $transaction->rollBack(); }
(原因)創建數據庫連接(Creating DB Connections)
想要訪問數據庫,你首先需要通過創建一個 yii\db\Connection 實例來與之建立連接。
$db = new yii\db\Connection([ 'dsn' => 'mysql:host=localhost;dbname=example', 'username' => 'root', 'password' => '', 'charset' => 'utf8', ]);
因為數據庫連接經常需要在多個地方使用到, 一個常見的做法是以應用組件的方式來配置它,如下:
return [ // ... 'components' => [ // ... 'db' => [ 'class' => 'yii\db\Connection', 'dsn' => 'mysql:host=localhost;dbname=example', 'username' => 'root', 'password' => '', 'charset' => 'utf8', ], ], // ... ];
之后你就可以通過語句 Yii::$app->db
來使用數據庫連接了。
對於隔離級別,yii\db\Transaction 也提前定義了幾個常量:
const READ_UNCOMMITTED = 'READ UNCOMMITTED'; // 讀未提交 const READ_COMMITTED = 'READ COMMITTED'; // 讀提交 const REPEATABLE_READ = 'REPEATABLE READ'; // 可重復讀 const SERIALIZABLE = 'SERIALIZABLE'; // 串行化
可以直接使用
// 開啟事務 隔離級別 串行化 $transaction = Yii::$app->db->beginTransaction( yii\db\Transaction::SERIALIZABLE);
MySQL 事務隔離級別忘了的可以看看這個
MySQL事務是不支持嵌套的,但是Yii2框架使用了緩存,可以使用事務嵌套,同學們可以打開下面鏈接看看
深入理解Yii2.0之事務(Transaction)