Start · Sprachen · PHP · Referenz · sqlsrv_rollback

sqlsrv_rollback

Funktion

Macht eine mit <code>sqlsrv_begin_transaction</code> begonnene Transaktion rückgängig und versetzt die Verbindung wieder in den Autocommit-Modus.

seit PHP 1.0.0 Kategorie: db

Signatur

sqlsrv_rollback(resource $conn): bool

Beschreibung

sqlsrv_rollback bricht eine laufende Transaktion ab und stellt den Datenbankzustand vor Beginn der Transaktion wieder her. Sie wird typischerweise im Fehlerfall aufgerufen, um sicherzustellen, dass keine unvollständigen oder inkonsistenten Daten in der Datenbank verbleiben.

Eine Transaktion muss zuvor explizit mit sqlsrv_begin_transaction gestartet worden sein. Nach dem Rollback befindet sich die Verbindung wieder im Autocommit-Modus, sodass folgende SQL-Anweisungen sofort und automatisch festgeschrieben werden.

Typisches Verwendungsmuster: Starte eine Transaktion, führe mehrere abhängige Datenbankoperationen durch, prüfe auf Fehler und rufe im Fehlerfall sqlsrv_rollback auf. Bei Erfolg wird stattdessen sqlsrv_commit aufgerufen. Dieses Muster gewährleistet die Atomarität (ACID) der ausgeführten Operationen.

Es ist wichtig, den Rückgabewert von sqlsrv_rollback zu prüfen, da die Funktion false zurückgibt, wenn keine aktive Transaktion vorhanden ist oder ein anderer Fehler auftritt.

Parameter

Name Typ Default Beschreibung
$conn Pflicht resource Die aktive SQLSRV-Datenbankverbindung, die mit sqlsrv_connect erstellt wurde und eine laufende Transaktion besitzt.

Rückgabewert

Typ
bool
Beschreibung
Gibt true zurück, wenn der Rollback erfolgreich war. Gibt false zurück, wenn keine aktive Transaktion vorhanden ist oder ein Fehler aufgetreten ist. Mit sqlsrv_errors können weitere Fehlerdetails abgerufen werden.

Beispiele

Transaktion mit Rollback im Fehlerfall

<?php
$serverName = 'localhost';
$connectionInfo = [
    'Database' => 'meineDatenbank',
    'UID'      => 'benutzer',
    'PWD'      => 'passwort',
];

$conn = sqlsrv_connect($serverName, $connectionInfo);
if ($conn === false) {
    die(print_r(sqlsrv_errors(), true));
}

// Transaktion starten
if (sqlsrv_begin_transaction($conn) === false) {
    die(print_r(sqlsrv_errors(), true));
}

$sql1 = "UPDATE Konten SET Saldo = Saldo - 100 WHERE KontoID = 1";
$sql2 = "UPDATE Konten SET Saldo = Saldo + 100 WHERE KontoID = 2";

$stmt1 = sqlsrv_query($conn, $sql1);
$stmt2 = sqlsrv_query($conn, $sql2);

if ($stmt1 === false || $stmt2 === false) {
    // Fehler: Transaktion rückgängig machen
    if (sqlsrv_rollback($conn)) {
        echo "Transaktion wurde zurückgerollt." . PHP_EOL;
    } else {
        echo "Rollback fehlgeschlagen: " . print_r(sqlsrv_errors(), true);
    }
} else {
    // Erfolg: Transaktion festschreiben
    if (sqlsrv_commit($conn)) {
        echo "Transaktion erfolgreich abgeschlossen." . PHP_EOL;
    } else {
        sqlsrv_rollback($conn);
        echo "Commit fehlgeschlagen, Rollback durchgeführt." . PHP_EOL;
    }
}

sqlsrv_close($conn);
Transaktion erfolgreich abgeschlossen.

Rollback bei Exception (try-catch-Muster)

<?php
function ueberweisungDurchfuehren(resource $conn, int $vonKonto, int $nachKonto, float $betrag): void
{
    if (sqlsrv_begin_transaction($conn) === false) {
        throw new RuntimeException('Transaktion konnte nicht gestartet werden.');
    }

    try {
        $params1 = [$betrag, $vonKonto];
        $params2 = [$betrag, $nachKonto];

        $stmt1 = sqlsrv_query($conn, "UPDATE Konten SET Saldo = Saldo - ? WHERE KontoID = ?", $params1);
        if ($stmt1 === false) {
            throw new RuntimeException('Abbuchung fehlgeschlagen.');
        }

        $stmt2 = sqlsrv_query($conn, "UPDATE Konten SET Saldo = Saldo + ? WHERE KontoID = ?", $params2);
        if ($stmt2 === false) {
            throw new RuntimeException('Gutschrift fehlgeschlagen.');
        }

        sqlsrv_commit($conn);
        echo "Überweisung über {$betrag} EUR erfolgreich." . PHP_EOL;
    } catch (RuntimeException $e) {
        sqlsrv_rollback($conn);
        echo "Fehler: " . $e->getMessage() . " – Rollback durchgeführt." . PHP_EOL;
    }
}

$conn = sqlsrv_connect('localhost', ['Database' => 'meineDatenbank', 'UID' => 'benutzer', 'PWD' => 'passwort']);
if ($conn) {
    ueberweisungDurchfuehren($conn, 1, 2, 250.00);
    sqlsrv_close($conn);
}
Überweisung über 250 EUR erfolgreich.

// Wichtig · Fallstricke

Kein aktiver Transaktionskontext: Wird sqlsrv_rollback aufgerufen, ohne dass zuvor sqlsrv_begin_transaction aufgerufen wurde, gibt die Funktion false zurück und erzeugt einen Fehler. Prüfe daher stets, ob eine Transaktion aktiv ist.

Autocommit-Modus: Nach einem erfolgreichen Rollback wechselt die Verbindung automatisch zurück in den Autocommit-Modus. Alle folgenden Anweisungen werden direkt festgeschrieben, sofern keine neue Transaktion gestartet wird.

Ressourcen freigeben: Bevor sqlsrv_rollback aufgerufen wird, sollten nicht mehr benötigte Statement-Ressourcen mit sqlsrv_free_stmt freigegeben werden, um Ressourcenlecks zu vermeiden.