Korrekte Verwendung von Datenbanktransaktionen

Die Verwendung von Datenbanktransaktionen in webman entspricht der in anderen Frameworks. Hier die wichtigsten Punkte:

Codestruktur

Die Codestruktur entspricht der in anderen Frameworks (z. B. Laravel, think-orm ähnlich):

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

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

Wichtig: Sie müssen \Throwable verwenden und dürfen nicht \Exception nutzen, da in der Geschäftslogik Error ausgelöst werden kann, der nicht von Exception erbt.

Datenbankverbindung

Bei der Arbeit mit Modellen innerhalb einer Transaktion ist zu beachten, ob das Modell eine Verbindung konfiguriert hat. Wenn das Modell eine Verbindung festlegt, muss diese beim Start der Transaktion angegeben werden; andernfalls greift die Transaktion nicht (think-orm ähnlich). Beispiel:

<?php

namespace app\model;
use support\Model;

class User extends Model
{

    // Verbindung für das Modell festgelegt
    protected $connection = 'mysql';

    protected $table = 'users';

    protected $primaryKey = 'id';

}

Wenn das Modell eine Verbindung festlegt, müssen Sie für begin, commit und rollback die Verbindung angeben:

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

Anfragen mit nicht bestätigten Transaktionen finden

Manchmal führt ein Fehler im Geschäftscode dazu, dass eine Transaktion nicht bestätigt wird. Um schnell zu ermitteln, welche Controller-Methode betroffen ist, können Sie die Komponente webman/log installieren. Diese prüft nach jeder Anfrage automatisch auf nicht bestätigte Transaktionen und protokolliert sie. Das Protokoll-Schlüsselwort lautet Uncommitted transactions.

Installation von webman/log

composer require webman/log

Hinweis
Nach der Installation muss ein Neustart (restart) erfolgen; reload reicht nicht aus.