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