Operações de transação de modelo
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, MySQL
o MyISAM
não suporta transações, precisa usar o InnoDB
mecanismo.
Use navcat
ferramentas podem ser encontradas 设计表
no 选项
achado 引擎
, revista como InnoDB
a:
Dicas: Cada tabela de dados precisa modificar o
InnoDB
mecanismo separadamente .
2. O modelo ThinkPHP usa transações
O documento oficial descreve o Db
processamento 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:
pode ser visto id
como 9,10
os dados não existem, o efeito do qual é revertido, a segunda operação quando a falha A primeira operação também será revertida.