<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                #### 前提: > 使用事務處理的話,需要數據庫引擎支持事務處理。比如 MySQL 的 MyISAM 不支持事務處理,需要使用 InnoDB 引擎。 #### 事務操作 * 依據 tp5.1手冊提供的 [事務操作介紹](https://links.jianshu.com/go?to=https%3A%2F%2Fwww.hmoore.net%2Fmanual%2Fthinkphp5_1%2F354035),隨便寫一個例子: > 使用場景 ~~~php Db::startTrans(); try{ Db::name('users')->insert(array('name'=>'mike','age'=>28)); Db::name('products')->where('id','=',1)->update(array('status'=>2)); Db::commit(); return json_return("事務操作成功"); // json_return() 為封裝返回json數據的方法 }catch (\Exception $e){ Db::rollback(); return json_return($e->getMessage()); // json_return() 為封裝返回json數據的方法 } ~~~ 針對事務操作,我們首先需要了解事務的意義:這里不詳述了,不清楚的朋友可參考 [MySQL事務](https://links.jianshu.com/go?to=https%3A%2F%2Fwww.runoob.com%2Fmysql%2Fmysql-transaction.html) 進行了解。 > 常見問題 * 問題1:如上代碼中如果第一條新增語句 返回 true , 第二條更新語句返回 false ,那這個事務還是會 commit 的,而不是我們預期的rellback,這是為什么? ~~~php 如果想讓兩條 sql 真正按照自己的意愿都 "執行成功(都返回 true 時)" 時再提交事務,那需要這樣寫: Db::startTrans(); try{ $res1 = Db::name('users')->insert(array('name'=>'mike','age'=>28)); $res2= Db::name('products')->where('id','=',1)->update(array('status'=>2)); }catch (\Exception $e){ Db::rollback(); } if($re1 && $re2){ Db::commit(); return json_return("事務操作成功"); // json_return() 為封裝返回json數據的方法 }else{ Db::rollback(); return json_return($e->getMessage()); // json_return() 為封裝返回json數據的方法 } 【延伸】 事務回滾的條件指的是 sql 語法報錯,而不是增加、刪除、更改 sql 時的影響行數為0 ~~~ * 問題2: 在事務中,使用了tp5 的函數 $this->success(),即使事務里面的 sql 語句都成功了,但還是走了rollback,為什么? ~~~php Db::startTrans(); try{ Db::name('users')->insert(array('name'=>'mike','age'=>28)); Db::name('products')->where('id','=',1)->update(array('status'=>2)); Db::commit(); $this->success("事務操作成功"); }catch (\Exception $e){ Db::rollback(); $this->error($e->getMessage()); } 是因為$this->success() 這個函數的源碼其實也是會拋出異常(這里可查看$this->success() 的方法), 解決辦法: 將 catch (\Exception $exception) 改成 catch (\think\Exception\DbException $exception) // 僅catch sql 異常 即可。 ~~~ 作者:mike\_lp 鏈接:https://www.jianshu.com/p/d9aeabd9b368 來源:簡書 著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請注明出處。
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看