Operações básicas do projeto ThinkPHP6 (19. Parte real das operações de transação do modelo Mysql)

Prefácio

As operações de transação são particularmente importantes em operações de banco de dados complexas, especialmente ao operar várias tabelas. Se uma etapa estiver errada, isso causará dados sujos, o que é muito perigoso. Por exemplo, a operação da Tabela A precisa operar a Tabela B novamente. , Se a operação da tabela A for bem-sucedida e a operação da tabela B falhar, os dados da tabela A precisam ser revertidos, caso contrário, a tabela A terá dados sujos. Neste momento, o processamento de transações é útil.

1. Atenção ao banco de dados Mysql

Se você usar o processamento de transações, precisará de um mecanismo de banco de dados para suportar o processamento de transações. Por exemplo, MySQLo MyISAMnão suporta transações, precisa usar o InnoDBmecanismo.
Use navcatferramentas podem ser encontradas 设计表no 选项achado 引擎, revista como InnoDBa:
Insira a descrição da imagem aqui

Dicas: Cada tabela de dados precisa modificar o InnoDBmecanismo separadamente .

2. O modelo ThinkPHP usa transações

O documento oficial descreve o Dbprocessamento de transações do banco de dados de operação da classe, portanto, não vou falar sobre isso aqui. Aqui está 模型como usar o banco de dados de operação.

Dê um exemplo simples:

  • O primeiro passo é inserir os dados do usuário de acordo com o nome do usuário e a senha;
  • A segunda etapa é modificar o número do telefone celular do usuário recém-adicionado para 123;
    se uma das operações falhar, tudo reverterá e excluirá os dados do usuário.

Camada de controle

public function insert(){
    
    
	// 演示数据
    $data = [
        "username" => "zhangsan",
        "password" => "12313212"
    ];
    $res = (new UserBis())->insertData($data);
    if(!$res) {
    
    
        return show(0, "新增失败");
    }
    return show(1,"新增成功");
}

Camada de negócios

<?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;
    }
}

Camada 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;
    }
}

Para verificar o resultado da reversão, eu defini o resultado da segunda operação do banco de dados como false:

$res = $user->save(["id"=>$uid,"phone_number"=>"123"]);
// 模拟操作出错的情况
$res = false;

1,2 vezes o processo normal, a situação de erro analógico de terceira e quarta revisão, quinto processamento normal:
Insira a descrição da imagem aqui
pode ser visto idcomo 9,10os dados não existem, o efeito do qual é revertido, a segunda operação quando a falha A primeira operação também será revertida.

Acho que você gosta

Origin blog.csdn.net/zy1281539626/article/details/112129778
Recomendado
Clasificación