积木工具箱 发表于 2021-6-18 17:37

thinkphp5事务请教

      Db::startTrans();
      try {
            $user = Db::query("select * from px_user where account = ?",[$account]);;
            if($user){
                return MyUtil::jsonResult(1,"注册失败,账号已存在",null);
            }else{
                Db::execute("insert into px_user() value(:user_id,:name,:account,:password,:create_time,:update_time,:icon)",$data);
                Db::execute("insert into px_take_a_shot() value(9,?,?)",);
                // 提交事务
                Db::commit();
                return MyUtil::jsonResult(0,"注册成功",$data);
            }

      } catch (\Exception $e) {
            // 回滚事务
            Db::rollback();
            return MyUtil::jsonResult(1,"错误",$data);
      }


如代码 其中注册失败是直接return的 事务并没有提交 会有影响吗?

stu2162583 发表于 2021-6-18 18:01

你可以换一种写法。有问题就throw出来,这样都是走catch,就不需要考虑这个问题了
Db::startTrans();
try {
    $user = Db::query("select * from px_user where account = ?",[$account]);;
    if($user){
                throw new Exception("注册失败,账号已存在");
    }
      
      Db::execute("insert into px_user() value(:user_id,:name,:account,:password,:create_time,:update_time,:icon)",$data);
      Db::execute("insert into px_take_a_shot() value(9,?,?)",);
      // 提交事务
      Db::commit();
      return MyUtil::jsonResult(0,"注册成功",$data);

} catch (\Exception $e) {
    // 回滚事务
    Db::rollback();
    return MyUtil::jsonResult(1,$e->getMessage(),$data);
}

kof21411 发表于 2021-6-18 21:01

其实直接return是可以的,如果throw 不好返回前端

Cyntec 发表于 2021-6-18 21:02

这里的查询并不需要开启事务。

杨十一啊 发表于 2021-6-18 21:14

throw 是可以自定义 自定义throw,然后出现问题直接抛出throw ,传给throw错误码和信息 ,就相当于返回个接口异常
页: [1]
查看完整版本: thinkphp5事务请教