Richtiges Verwenden von Transaktionen

Webman verwendet Datenbanktransaktionen auf die gleiche Weise wie andere Frameworks. Hier sind einige Punkte, die beachtet werden müssen.

Code-Struktur

Die Code-Struktur ist die gleiche wie bei anderen Frameworks, zum Beispiel der Verwendung von Laravel (think-orm ähnlich).

Db::beginTransaction();
try {
    // ..Geschäftslogik überspringen...

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

Hier ist besonders zu beachten, dass unbedingt \Throwable und nicht \Exception verwendet werden muss, da während der Geschäftsverarbeitung möglicherweise ein Error ausgelöst wird, das nicht zu Exception gehört.

Datenbankverbindung

Beim Arbeiten mit Modellen in Transaktionen ist besonders darauf zu achten, ob das Modell eine Verbindung festgelegt hat. Wenn das Modell eine Verbindung festgelegt hat, muss beim Starten der Transaktion diese Verbindung angegeben werden, da die Transaktion sonst ungültig ist (think-orm ähnlich). Zum Beispiel:

<?php

namespace app\model;
use support\Model;

class User extends Model
{

    // Hier wird dem Modell eine Verbindung zugewiesen
    protected $connection = 'mysql';

    protected $table = 'users';

    protected $primaryKey = 'id';

}

Wenn für das Modell eine Verbindung angegeben ist, müssen beim Starten der Transaktion, beim Commit und beim Rollback die Verbindung spezifiziert werden.

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

Finden von nicht bestätigten Transaktionen

Manchmal führt ein Fehler im Geschäftscode dazu, dass eine Transaktion für eine bestimmte Anfrage nicht bestätigt wird. Um schnell zu lokalisieren, welche Controller-Methode die Transaktion nicht bestätigt hat, kann das webman/log-Modul installiert werden. Dieses Modul überprüft nach Abschluss der Anfrage automatisch, ob unbestätigte Transaktionen vorhanden sind, und protokolliert diese. Der Protokollschlüssel lautet Uncommitted transactions.

Installationsmethode für webman/log

composer require webman/log

Hinweis
Nach der Installation muss ein Neustart durchgeführt werden; Reload hat keine Wirkung.