Skip to main content

事务

方法一:

Yii::$app->db->transaction(function(){
//逻辑代码
});


方法二:

$transaction = Yii::$app->db->beginTransaction();
try {
    //逻辑代码
    $transaction->commit();
} catch (\Exception $e) {
    $transaction->rollBack();
    throw $e;
}

事务嵌套

$db = Yii::$app->db;

// 外层事务开始(真正的 BEGIN)
$outerTransaction = $db->beginTransaction();
try {
    // 执行一些SQL操作...
    $db->createCommand()->insert('user', ['name' => 'user1'])->execute();

    // 内层“事务”块开始(创建保存点 SAVEPOINT level1)
    $innerTransaction = $db->beginTransaction();
    try {
        // 执行更多SQL操作...
        $db->createCommand()->insert('article', ['title' => 'article1'])->execute();

        // 模拟内层操作失败
        // throw new Exception(‘Inner error’);

        // 内层“提交”(释放保存点,并非真正的COMMIT)
        $innerTransaction->commit();
    } catch (\Exception $e) {
        // 内层回滚(执行 ROLLBACK TO SAVEPOINT level1)
        //  article 表插入会被回滚,user 表插入仍然存在
        $innerTransaction->rollBack();
        // 可以选择继续抛出异常,让外部事务也回滚
        // throw $e;
    }

    // 如果内层回滚了,代码会继续执行在这里
    // 可以执行其他操作...

    // 外层提交(真正的 COMMIT)
    $outerTransaction->commit();
    echo "All operations committed.";
} catch (\Exception $e) {
    // 外层回滚(真正的 ROLLBACK,回滚所有操作)
    $outerTransaction->rollBack();
    echo "Transaction failed: " . $e->getMessage();
}