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.