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.