ThinkPHP6项目基操(19.实战部分 Mysql模型事务操作)
生活随笔
收集整理的這篇文章主要介紹了
ThinkPHP6项目基操(19.实战部分 Mysql模型事务操作)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
模型事務操作
- 前言
- 1. Mysql數據庫注意
- 2. thinkPHP模型使用事務
前言
事務操作在復雜的數據庫操作的時候尤為重要,特別是在操作多張表的時候,如果某一步驟出錯了,就會導致有臟數據,會很危險,比如A表操作完需要再操作B表,如果A表操作成功,B表操作失敗,那么A表的數據需要回滾,否則A表就會有臟數據。這個時候事務處理就派上用場了。
1. Mysql數據庫注意
使用事務處理的話,需要數據庫引擎支持事務處理。比如 MySQL 的 MyISAM 不支持事務處理,需要使用 InnoDB 引擎。
使用navcat工具的可以在設計表中的選項找到引擎,修改為InnoDB即可:
Tips: 每張數據表都需要單獨修改InnoDB引擎。
2. thinkPHP模型使用事務
官方文檔介紹的是Db類操作數據庫的事務處理,這里就不說了。這里介紹的是使用模型操作數據庫如何做。
舉個簡單的例子:
- 第一步,根據用戶名、密碼插入用戶數據;
- 第二步,修改剛新增用戶的手機號為123;
若其中一步操作失敗則全部回滾,此用戶數據刪除。
控制器層
public function insert(){// 演示數據$data = ["username" => "zhangsan","password" => "12313212"];$res = (new UserBis())->insertData($data);if(!$res) {return show(0, "新增失敗");}return show(1,"新增成功"); }Business層
<?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 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:
$res = $user->save(["id"=>$uid,"phone_number"=>"123"]); // 模擬操作出錯的情況 $res = false;第1,2次正常處理,第3,4次修改為模擬出錯的情況,第5次正常處理:
可以看到id為9,10的數據不存在,這就是回滾的效果,當第二次操作失敗的時候第一次的操作也會回滾。
??重磅推薦:免費商用電商系統
😏想白嫖整個電商系統用來商用?
🤑想有自己的商城實現財富自由?
🤓想學習最佳實踐提升自己技術?
快來進入🚀 傳送門 🚀,開源免費、完整示例帶你快速入門,輕松二開,走上人生巔峰!👨?🎓
總結
以上是生活随笔為你收集整理的ThinkPHP6项目基操(19.实战部分 Mysql模型事务操作)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: php 输出 继续执行,使用PHP中的实
- 下一篇: docker 安装mysql_docke