Utilizzo corretto delle transazioni

L'utilizzo delle transazioni nei database con webman è simile ad altri framework, qui sono elencati alcuni aspetti da tenere a mente.

Struttura del codice

La struttura del codice è simile a quella di altri framework, ad esempio l'utilizzo in Laravel (simile a think-orm)

Db::beginTransaction();
try {
    // ..gestione della logica aziendale...

    Db::commit();
} catch (\Throwable $exception) {
    Db::rollBack();
}

È particolarmente importante notare che deve essere utilizzato \Throwable e non deve essere utilizzato \Exception, poiché durante la gestione della logica aziendale potrebbe verificarsi un Error, che non appartiene a Exception.

Connessione al database

Quando si opera sui modelli all'interno di una transazione, è importante verificare se il modello ha impostato una connessione. Se il modello ha impostato una connessione, è necessario specificarla quando si avvia la transazione, altrimenti la transazione sarà inefficace (simile a think-orm). Ad esempio:

<?php

namespace app\model;
use support\Model;

class User extends Model
{

    // Qui viene specificata la connessione per il modello
    protected $connection = 'mysql';

    protected $table = 'users';

    protected $primaryKey = 'id';

}

Quando un modello ha specificato una connessione, l'apertura, il commit e il rollback della transazione devono specificare la connessione.

Db::connection('mysql')->beginTransaction();
try {
    // Gestione della logica aziendale
    $user = new User;
    $user->name = 'webman';
    $user->save();
    Db::connection('mysql')->commit();
} catch (\Throwable $exception) {
    Db::connection('mysql')->rollBack();
}

Individuazione delle richieste con transazioni non confermate

A volte, un bug nel codice aziendale può causare il mancato commit di una transazione in una richiesta. Per individuare rapidamente quale metodo del controller non ha effettuato il commit della transazione, è possibile installare il componente webman/log, che controllerà automaticamente, al termine della richiesta, se esistono transazioni non confermate e registrerà la log, utilizzando la parola chiave Uncommitted transactions.

Metodo di installazione di webman/log

composer require webman/log

Attenzione
Dopo l'installazione è necessario riavviare, il comando reload non ha effetto.