### 模型事务操作
* 前言
* 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`的数据不存在,这就是回滚的效果,当第二次操作失败的时候第一次的操作也会回滚。
- 空白目录
- 使用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,各层写的内容