thinkphp5 try catch 事务疑问

方式1

Db::startTrans();
try{
    Db::name('table1')->update(1);
    Db::name('table2')->update(2);
    Db::commit();
    }catch(){

    Db::rollback();
}

方式2

$status = false;
Db::startTrans();
try{
    $res = Db::name('table1')->update(1);
    $res1 =  Db::name('table2')->update(2);
    if($res && $res1)
    {
        $status = true;
        Db::commit();
    }
    
    }catch(){

    Db::rollback();
}
这两种方式用的哪一种更好
我之前一直都是使用第一种,不知道会有什么毛病不?
阅读 6.8k
5 个回答

没必要啊,错误了自然会到catch里面去啊

看业务场景,如果后续不需要回滚结果,使用第一个就行。

我觉得方法1很好,很简洁。try catch可以捕获到很多的错误,像这个sql语句执行错误肯定是可以的。第二种方法略有瑕疵,在判断是否成功的情况下应该用!==false,不然在修改0条记录的情况下你会误判为失败而回滚。

普通的数据库操作方法1更好,但是在有遍历循环操作数据表的时候使用方法2会更好.例如

$status = true;
Db::startTrans();

$res = Db::name('table1')->update(1);
foreach($array as $value){
     $res1 = Db::name('table2')->update([$key=>$value]);  
     if(!$res1)
     {
        $status = false;
     }
}

if($res && $status){
    Db::commit();
}else{
    Db::rollback();
}

这样能确保遍历操作数据表的操作都是正确的.

方法一好一些,tra..catch..机制可以捕捉到你sql的错误了,没有必要再做额外的判断。
而且这样写简洁明了

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题