在webman-admin中,写了一个简单操作,使用到了事务,使用回滚之后,但是不生效

bang

问题描述

在webman-admin中,控制器写了一个简单操作,使用到了事务,使用回滚之后,但是不生效。
明明我在try和catch都已经回滚了,但是还是不生效。

引用类为 support\Db;

程序代码或配置

public function test(Request $request): Response
    {
        if ($request->method() === 'POST') {
            [$id, $data] = $this->updateInput($request, false);
            $money = $data['operate_value'] ?? 0;
            Db::beginTransaction();
            try {
                if($data['operate_type'] == 1){
                    User::money($money, $id, MoneyLog::ADMIN_OPERATE);
                }elseif($data['operate_type'] == 0){
                    User::money(bcmul($money,-1, 2), $id,MoneyLog::ADMIN_OPERATE);
                }
                Db::rollBack();
            }catch (\Exception $e){
                Db::rollBack();
                return $this->fail(1);
            }
            return $this->success();
        }
        return raw_view('user/test');

    }
396 2 1
2个回答

keytehu

事物要使用相同的连接才能生效,Db::beginTransaction(); 默认使用的是defualt连接,你需要看下User 模型是用的哪个连接。
然后用类似 Db::connection('具体连接')->beginTransaction();开启事物,Db::connection('具体连接')->rollBack(); 回滚事物,提交事物也类似

  • bang 2024-02-03

    大哥,你是 正解

bang

事物要使用相同的连接才能生效。以下是个人的解决方法

plugin/admin/app/functions.php 文件中添加以下函数

/**
 * 返回DB链接
 * @param string $connection
 * @return Connection
 */
function M(string $connection = 'plugin.admin.mysql'): Connection
{
    return Db::connection($connection);
}

然后在控制器中使用
M()->beginTransaction();事务开启
M()->commit();事务提交
M()->rollBack();事务回滚

切记不要用Db,否则回滚会失败的

  • zhlin163 2024-03-09

    确实,不过可以用带的Util::db() 获取 admin的db连接

🔝