Hyperf 數據庫事務指南(PHP 框架)
1. ???數據庫配置
1.1 配置文件
MySQL 配置位于?config/database.php
,通常通過環境變量(.env
)管理敏感信息:
<?phpdeclare(strict_types = 1);
/*** This file is part of Hyperf.* @link https://www.hyperf.io* @document https://hyperf.wiki* @contact group@hyperf.io* @license https://github.com/hyperf/hyperf/blob/master/LICENSE*/
return ['default' => ['driver' => env('DB_DRIVER', 'mysql'),'host' => env('DB_HOST', 'localhost'),'database' => env('DB_DATABASE', 'hyperf'),'port' => env('DB_PORT', 3306),'username' => env('DB_USERNAME', 'root'),'password' => env('DB_PASSWORD', ''),'charset' => env('DB_CHARSET', 'utf8mb4'),'collation' => env('DB_COLLATION', 'utf8mb4_general_ci'),'prefix' => env('DB_PREFIX', ''),'pool' => ['min_connections' => 1,'max_connections' => 10,'connect_timeout' => 10.0,'wait_timeout' => 3.0,'heartbeat' => -1,'max_idle_time' => (float)env('DB_MAX_IDLE_TIME', 60),],'commands' => ['gen:model' => ['path' => 'app/Model','force_casts' => true,'inheritance' => 'Model',],],],
];
1.2 環境變量示例(.env)
配置在.env文件中 而不會去修改 配置datebase文件。
DB_DRIVER=mysql
DB_HOST=121.40.75.201
DB_PORT=3307
DB_DATABASE=xm-trace-source-test
DB_USERNAME=root
DB_PASSWORD=0T4hs5ZHqxjBIS8gww
DB_CHARSET=utf8mb4
DB_COLLATION=utf8mb4_unicode_ci
DB_PREFIX=
配置成功后。在業務邏輯代碼中,啟動數據庫事務
有倆種使用方式:1. 自動事務(閉包方式) 2. 手動事務(beginTransaction + commit/rollBack)
2. 🔄事務使用方式
2.1 自動事務(閉包)
適用場景:簡單單表操作
特點:自動提交/回滾,代碼簡潔但無法自定義異常處理
// 閉包函數,自動處理事務的提交和回滾(出錯時候),
// 無法在外部捕獲特定異常:如果需要在事務失敗后執行額外邏輯,可能不太靈活。無法手動控制提交/回滾:適用于簡單場景,復雜邏輯可能不適合。b::transaction(function () use ($articleIDArr) {Article::whereIn('article_id', $articleIDArr)->delete();
});
2.2 手動事務
適用場景:需要精細控制的復雜事務
// 手動控制錯誤異常
Db::beginTransaction();try {$sourceGoodsDb = SourceGoods::query()->lockForUpdate()->find($sourceGoodsID);if ($sourceGoodsDb->isEmpty()) {throw new MyException('未知的朔源商品');}$sourceGoodsDb->delete();Db::commit();
}
catch (\Exception $e) {Db::rollBack();throw new MyException('刪除失敗');
}
總結
方式 | 適用場景 | 優點 | 缺點 |
---|---|---|---|
Db::transaction | 簡單操作(單表CRUD) | 自動提交/回滾,代碼簡潔 | 無法靈活控制異常 |
手動事務 | 復雜事務(多步驟、額外邏輯) | 精細控制,可處理不同異常 | 代碼稍多,需手動管理 |
如果你的業務邏輯較簡單,推薦使用?Db::transaction
;如果需要更精細的控制(如額外邏輯、特定異常處理),則使用手動事務方式。
提示:事務嵌套時,Hyperf 會合并為單個事務處理。