<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>

                合規國際互聯網加速 OSASE為企業客戶提供高速穩定SD-WAN國際加速解決方案。 廣告
                ### 模型事務操作 * 前言 * 1\. Mysql數據庫注意 * 2\. thinkPHP模型使用事務 # 前言 事務操作在復雜的數據庫操作的時候尤為重要,特別是在操作多張表的時候,如果某一步驟出錯了,就會導致有臟數據,會很危險,比如A表操作完需要再操作B表,如果A表操作成功,B表操作失敗,那么A表的數據需要回滾,否則A表就會有臟數據。這個時候事務處理就派上用場了。 # 1\. Mysql數據庫注意 使用事務處理的話,需要數據庫引擎支持事務處理。比如`MySQL`的`MyISAM`不支持事務處理,需要使用`InnoDB`引擎。 使用`navcat`工具的可以在`設計表`中的`選項`找到`引擎`,修改為`InnoDB`即可: ![在這里插入圖片描述](https://img-blog.csdnimg.cn/20210102233620966.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3p5MTI4MTUzOTYyNg==,size_16,color_FFFFFF,t_70) > Tips: 每張數據表都需要單獨修改`InnoDB`引擎。 # 2\. thinkPHP模型使用事務 官方文檔介紹的是`Db`類操作數據庫的事務處理,這里就不說了。這里介紹的是使用`模型`操作數據庫如何做。 舉個簡單的例子: * 第一步,根據用戶名、密碼插入用戶數據; * 第二步,修改剛新增用戶的手機號為123; 若其中一步操作失敗則全部回滾,此用戶數據刪除。 > 控制器層 ~~~php public function insert(){// 演示數據$data = ["username" => "zhangsan","password" => "12313212"];$res = (new UserBis())->insertData($data);if(!$res) {return show(0, "新增失敗");}return show(1,"新增成功"); } ~~~ > Business層 ~~~php <?php namespace app\admin\business; use app\common\model\mysql\User as UserModel; use think\Exception;class User extends BaseBis {protected $model = null;public function __construct(){$this->model = new UserModel();}public function insertData($data){// 開啟事務$this->model->startTrans();try {$uid = $this->add($data);if(!$uid){return $uid;}$user = $this->model->find($uid);$res = $user->save(["id"=>$uid,"phone_number"=>"123"]);if(!$res){throw new Exception("更新手機號失敗");}// 提交事務$this->model->commit();}catch (Exception $e){// 事務回滾$this->model->rollback();return false;}return true;} } ~~~ > BaseBis層 ~~~php <?php namespace app\admin\business; use think\Exception; class BaseBis {protected $model;public function add($data){// 默認status字段賦值$data['status'] = config("status.mysql.table_normal");try {$res = $this->model->save($data);}catch (Exception $e){return 0;}// 返回idreturn $this->model->id;} } ~~~ 為了驗證回滾結果,我把第二次的數據庫操作的結果設置為`false`: ~~~php $res = $user->save(["id"=>$uid,"phone_number"=>"123"]); // 模擬操作出錯的情況 $res = false; ~~~ 第1,2次正常處理,第3,4次修改為模擬出錯的情況,第5次正常處理: ![在這里插入圖片描述](https://img-blog.csdnimg.cn/20210102235206252.png) 可以看到`id`為`9,10`的數據不存在,這就是回滾的效果,當第二次操作失敗的時候第一次的操作也會回滾。
                  <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>

                              哎呀哎呀视频在线观看