首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 相關知識

Yii 框架資料庫事務使用實戰:批次操作與回滾機制完整範例

     編輯:PHP 相關知識

Yii 框架資料庫事務使用實戰:批次操作與回滾機制完整範例

Yii 內建支援資料庫事務,配合 ActiveRecord 或 Query Builder 即可實現 ACID 特性。本文針對批次寫入、刪除等場景,提供標準事務範本與關鍵注意事項。

核心 API 速查

  • Yii::app()->db->beginTransaction():開啟事務,回傳 CDbTransaction 實例。
  • $transaction->commit():提交事務,持久化所有變更。
  • $transaction->rollback():回滾事務,撤銷所有未提交變更。

完整範例:批次新增用戶,任一失敗全數回滾

<?php
// 假設資料來源
$users = [
    ['username' => 'phpernote.com_0', 'password' => '123456'],
    ['username' => 'u_1',             'password' => '123456'],
    ['username' => 'u_2',             'password' => '123456'],
];

$transaction = Yii::app()->db->beginTransaction();
try {
    foreach ($users as $user) {
        // 使用 Command Builder 插入,參數自動綁定防注入
        Yii::app()->db->createCommand()->insert('tbl_user', $user);
    }
    $transaction->commit();
    echo "批次新增成功";
} catch (Exception $e) {
    $transaction->rollback();
    echo "事務回滾: " . $e->getMessage();
    // 可記錄日誌: Yii::log($e->getMessage(), CLogger::LEVEL_ERROR);
}
?>

關鍵注意事項 ⚠️

  1. 資料表引擎必須為 InnoDB:MyISAM 不支援事務,上述程式碼在 MyISAM 上執行 不會回滾,資料會部分寫入。建立表時指定 ENGINE=InnoDB。
  2. 異常捕獲範圍:try 區塊需包含所有需原子性的操作;若在迴圈外呼叫其它方法,確保該方法拋出的異常能冒泡到此處。
  3. 巢狀事務:Yii 1.x 不支援真正巢狀事務,若在事務中呼叫另一個開啟事務的方法,會導致外層事務提前提交。解決方案見「進階篇」。
  4. 隔離級別:可透過 $transaction->setIsolationLevel(Transaction::READ_COMMITTED) 設定(需 Yii 1.1.14+),預設為資料庫預設級別 (通常 REPEATABLE READ)。

進階:模擬巢狀事務 (Savepoint 機制)

Yii 2.0 內建支援 Savepoint,Yii 1.x 需手動實作:

<?php
// 在現有事務中建立儲存點
$transaction->getDbConnection()->createCommand("SAVEPOINT sp1")->execute();
// ... 執行子操作 ...
// 子操作失敗時回滾到儲存點
$transaction->getDbConnection()->createCommand("ROLLBACK TO SAVEPOINT sp1")->execute();
// 子操作成功時釋放儲存點
$transaction->getDbConnection()->createCommand("RELEASE SAVEPOINT sp1")->execute();
?>

常見應用場景

  • 電商下單:扣庫存 + 建訂單 + 扣優惠券 + 記流水,任一失敗全滾回。
  • 批次匯入:CSV/Excel 匯入數萬筆,分批次事務提交,避免長事務鎖表。
  • 跨服務一致性:配合消息佇列實現最終一致性 (TCC/Saga),本地事務為基石。

善用事務保障資料一致性,是後端開發的基本功。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved