Hyperf 数据库事务指南(PHP 框架)
1. ⚙️ 数据库配置
1.1 配置文件
MySQL 配置位于 config/database.php
,通常通过环境变量(.env
)管理敏感信息:
<?php
declare(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 会合并为单个事务处理。