Uso correcto de transacciones
El uso de transacciones en Webman es similar al de otros frameworks, aquí se enumeran algunas cosas a tener en cuenta.
Estructura del código
La estructura del código es la misma que en otros frameworks, por ejemplo, el uso en Laravel (similar a think-orm).
Db::beginTransaction();
try {
// ..procura de negocio omitida...
Db::commit();
} catch (\Throwable $exception) {
Db::rollBack();
}
Es especialmente importante tener en cuenta que debe utilizarse \Throwable
y no debe utilizarse \Exception
, ya que durante el procesamiento del negocio puede activarse un Error
, que no pertenece a Exception
.
Conexión a la base de datos
Al operar con modelos en transacciones, es especialmente importante verificar si el modelo tiene configurada una conexión. Si el modelo tiene configurada una conexión, al iniciar la transacción se debe especificar la conexión; de lo contrario, la transacción será inválida (similar a think-orm). Por ejemplo:
<?php
namespace app\model;
use support\Model;
class User extends Model
{
// Aquí se especifica la conexión del modelo
protected $connection = 'mysql';
protected $table = 'users';
protected $primaryKey = 'id';
}
Cuando el modelo especifica una conexión, iniciar transacciones, confirmarlas o revertirlas debe hacerse especificando la conexión.
Db::connection('mysql')->beginTransaction();
try {
// Procura de negocio
$user = new User;
$user->name = 'webman';
$user->save();
Db::connection('mysql')->commit();
} catch (\Throwable $exception) {
Db::connection('mysql')->rollBack();
}
Buscar solicitudes con transacciones no confirmadas
A veces, un error en el código empresarial hace que una transacción de una solicitud no se confirme. Para localizar rápidamente qué método del controlador no confirmo la transacción, se puede instalar el componente webman/log
, que revisará automáticamente después de que la solicitud haya finalizado si hay transacciones no confirmadas y registrará un log; la palabra clave del log será Uncommitted transactions
.
Método de instalación de webman/log
composer require webman/log
Nota
Después de la instalación, es necesario reiniciar,reload
no tiene efecto.