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.