Hyperf 数据库事务指南(PHP 框架)

发布于:2025-06-24 ⋅ 阅读:(16) ⋅ 点赞:(0)

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 会合并为单个事务处理。


网站公告

今日签到

点亮在社区的每一天
去签到