事务(Transaction)
在Yii中,使用 yii\db\Transaction 来表示数据库事务。
一般情况下,我们从数据库连接启用事务,通常采用如下的形式:
$transaction = $connection->beginTransaction();try { $connection->createCommand($sql1)->execute(); $connection->createCommand($sql2)->execute(); // ... executing other SQL statements ... $transaction->commit();} catch (Exception $e) { $transaction->rollBack();}复制代码
在上面的代码中,先是获取一个 yii\db\Transaction 对象,之后执行若干SQL 语句,然后调用之前 Transaction 对象的 commit() 方法。这一过程中, 如果捕获了异常,那么调用 rollBack() 进行回滚。
嵌套事务
在开头的例子中,展现的是事务最简单的使用形式。Yii还允许把事务嵌套起来使用。 比如,可以采用如下形式来使用事务:
$outerTransaction = $db->beginTransaction();try { $db->createCommand($sql1)->execute(); $innerTransaction = $db->beginTransaction(); try { $db->createCommand($sql2)->execute(); $db->createCommand($sql3)->execute(); $innerTransaction->commit(); } catch (Exception $e) { $innerTransaction->rollBack(); } $db->createCommand($sql4)->execute(); $outerTransaction->commit();} catch (Exception $e) { $outerTransaction->rollBack();复制代码