Uso correto de transações
O uso de transações de banco de dados no webman é semelhante ao de outros frameworks, aqui estão alguns pontos que merecem atenção.
Estrutura do código
A estrutura do código é a mesma que em outros frameworks, por exemplo, o uso em Laravel (semelhante ao think-orm)
Db::beginTransaction();
try {
// ..processamento de negócios omitido...
Db::commit();
} catch (\Throwable $exception) {
Db::rollBack();
}
Aqui é especialmente importante notar que é necessário usar \Throwable
e não pode usar \Exception
, pois durante o processamento de negócios pode ocorrer um Error
, que não se classifica como Exception
.
Conexão com o banco de dados
Ao operar modelos dentro de uma transação, é particularmente importante verificar se o modelo tem uma conexão definida. Se o modelo tiver uma conexão definida, ao iniciar a transação, deve-se especificar a conexão, caso contrário, a transação será inválida (semelhante ao think-orm). Por exemplo:
<?php
namespace app\model;
use support\Model;
class User extends Model
{
// Aqui a conexão é definida para o modelo
protected $connection = 'mysql';
protected $table = 'users';
protected $primaryKey = 'id';
}
Quando a conexão é especificada no modelo, iniciar a transação, confirmar a transação e reverter a transação deve-se especificar a conexão.
Db::connection('mysql')->beginTransaction();
try {
// Processamento de negócios
$user = new User;
$user->name = 'webman';
$user->save();
Db::connection('mysql')->commit();
} catch (\Throwable $exception) {
Db::connection('mysql')->rollBack();
}
Localizando requisições com transações não submetidas
Às vezes, um bug no código de negócios pode fazer com que uma transação de uma requisição não seja submetida. Para localizar rapidamente qual método do controlador não submeteu a transação, pode-se instalar o componente webman/log
, que verifica automaticamente se há transações não submetidas após a requisição ser concluída e registra em log, com a palavra-chave de log Uncommitted transactions
.
Método de instalação do webman/log
composer require webman/log
Atenção
Após a instalação, é necessário reiniciar (restart), o reload não terá efeito.