ThinkPHP6プロジェクトの基本操作(19. Mysqlモデルトランザクション操作の実際の部分)

序文

トランザクション操作は、複雑なデータベース操作、特に複数のテーブルを操作する場合に特に重要です。ステップが間違っていると、データがダーティになり、非常に危険です。たとえば、テーブルAの操作ではテーブルBを再度操作する必要があります。 、テーブルAの操作が成功し、テーブルBの操作が失敗した場合、テーブルAのデータをロールバックする必要があります。そうしないと、テーブルAのデータがダーティになります。現時点では、トランザクション処理が便利です。

1.Mysqlデータベースの注意

トランザクション処理を使用する場合は、トランザクション処理をサポートするデータベースエンジンが必要です。たとえば、MySQLMyISAMトランザクションをサポートしいないため、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の操作とき故障最初の操作もロールバックされます。

おすすめ

転載: blog.csdn.net/zy1281539626/article/details/112129778