### 模型事務操作
* 前言
* 1\. Mysql數據庫注意
* 2\. thinkPHP模型使用事務
# 前言
事務操作在復雜的數據庫操作的時候尤為重要,特別是在操作多張表的時候,如果某一步驟出錯了,就會導致有臟數據,會很危險,比如A表操作完需要再操作B表,如果A表操作成功,B表操作失敗,那么A表的數據需要回滾,否則A表就會有臟數據。這個時候事務處理就派上用場了。
# 1\. Mysql數據庫注意
使用事務處理的話,需要數據庫引擎支持事務處理。比如`MySQL`的`MyISAM`不支持事務處理,需要使用`InnoDB`引擎。
使用`navcat`工具的可以在`設計表`中的`選項`找到`引擎`,修改為`InnoDB`即可:

> 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次正常處理:

可以看到`id`為`9,10`的數據不存在,這就是回滾的效果,當第二次操作失敗的時候第一次的操作也會回滾。
- 空白目錄
- 使用thinkphp6搭建后端api接口流程
- tp6 uniapp vue 前后端跨域解決方案
- 操作記錄
- api00
- 你看看有沒有用
- 6666
- Docker安裝LNMP環境的詳細過程(可部署TP項目)
- LNMP部署thinkphp
- 玩客云Armbian 安裝LNMP環境 Docker
- ThinkPHP6項目基操(16.實戰部分 redis+token登錄)
- ThinkPHP6項目基操(11.實戰部分 部署后臺靜態頁面模板及后臺登錄頁面)
- ThinkPHP6項目基操(13.實戰部分 項目中的自定義異常處理總結 錯誤頁面API錯誤)
- ThinkPHP6項目基操(14.實戰部分 中間件處理登錄流程)
- ThinkPHP6項目基操(12.實戰部分 驗證碼)
- ThinkPHP6項目基操(18.實戰部分 表單令牌Token 防CSRF)
- ThinkPHP6項目基操(19.實戰部分 Mysql模型事務操作)
- ThinkPHP6項目基操(20.實戰部分 數據庫操作返回值總結)
- 瀏覽器端判斷當前設備的運行環境
- api
- api異常捕捉
- 寫一個中間件
- 統一的參數返回形式
- ThinkPHP6調用模型的方法
- thinkphp6控制器、驗證器、模型、service,各層寫的內容