トランザクション操作のモデル化
序文
トランザクション操作は、複雑なデータベース操作、特に複数のテーブルを操作する場合に特に重要です。ステップが間違っていると、データがダーティになり、非常に危険です。たとえば、テーブルAの操作ではテーブルBを再度操作する必要があります。 、テーブルAの操作が成功し、テーブルBの操作が失敗した場合、テーブルAのデータをロールバックする必要があります。そうしないと、テーブルAのデータがダーティになります。現時点では、トランザクション処理が便利です。
1.Mysqlデータベースの注意
トランザクション処理を使用する場合は、トランザクション処理をサポートするデータベースエンジンが必要です。たとえば、MySQL
はMyISAM
トランザクションをサポートしていないため、InnoDB
エンジンを使用する必要があります。
使用navcat
ツールは设计表
、次の选项
よう引擎
に改訂された検索で見つけることができますInnoDB
。
ヒント:各データテーブルは、
InnoDB
エンジンを個別に変更する必要があります。
2.ThinkPHPモデルはトランザクションを使用します
公式文書では、Db
クラス運用データベースのトランザクション処理について説明しているので、ここでは説明しません。模型
オペレーションデータベースの使い方は次のとおりです。
簡単な例を挙げてください。
- 最初のステップは、ユーザー名とパスワードに従ってユーザーデータを挿入することです。
- 2番目のステップは、新しく追加されたユーザーの携帯電話番号を123に変更することです。いずれ
かの操作が失敗した場合、すべてロールバックしてユーザーデータを削除します。
コントローラ層
public function insert(){
// 演示数据
$data = [
"username" => "zhangsan",
"password" => "12313212"
];
$res = (new UserBis())->insertData($data);
if(!$res) {
return show(0, "新增失败");
}
return show(1,"新增成功");
}
ビジネスレイヤー
<?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;
}
// 返回id
return $this->model->id;
}
}
ロールバックの結果を確認するために、2番目のデータベース操作の結果を次のように設定しますfalse
。
$res = $user->save(["id"=>$uid,"phone_number"=>"123"]);
// 模拟操作出错的情况
$res = false;
1,2回の通常処理、第三及び第四改正アナログエラー状況、第五の通常の処理:
見ることができるid
ように9,10
データが存在しない、という効果がロールバックされ、第2の操作とき故障最初の操作もロールバックされます。