Start · Sprachen · PHP · Referenz · sqlsrv_begin_transaction

sqlsrv_begin_transaction

Funktion

Startet eine Datenbanktransaktion auf einer SQL-Server-Verbindung und deaktiviert den Auto-Commit-Modus.

seit PHP 1.0.0 Kategorie: db

Signatur

sqlsrv_begin_transaction(resource $conn): bool

Beschreibung

sqlsrv_begin_transaction() leitet eine Transaktion auf einer mit sqlsrv_connect() hergestellten SQL-Server-Verbindung ein. Alle nachfolgenden SQL-Anweisungen werden Teil dieser Transaktion, bis sie entweder mit sqlsrv_commit() bestätigt oder mit sqlsrv_rollback() zurückgerollt wird.

Transaktionen sind essenziell, wenn mehrere zusammenhängende Datenbankoperationen atomar ausgeführt werden müssen – d. h. entweder alle oder keine. Typische Anwendungsfälle sind Überweisungen, Bestellvorgänge oder das gleichzeitige Aktualisieren mehrerer verknüpfter Tabellen.

Nach dem Aufruf von sqlsrv_begin_transaction() befindet sich die Verbindung im manuellen Transaktionsmodus. Nach Abschluss der Transaktion (Commit oder Rollback) wechselt die Verbindung automatisch zurück in den Auto-Commit-Modus.

Tritt ein Fehler auf, sollte mit sqlsrv_errors() die Fehlerursache ermittelt werden. Verschachtelte Transaktionen werden nicht direkt unterstützt; ein erneuter Aufruf vor dem Commit/Rollback führt zu einem Fehler.

Parameter

Name Typ Default Beschreibung
$conn Pflicht resource Eine aktive SQL-Server-Verbindungsressource, wie sie von sqlsrv_connect() zurückgegeben wird.

Rückgabewert

Typ
bool
Beschreibung
Gibt true zurück, wenn die Transaktion erfolgreich gestartet wurde, andernfalls false. Im Fehlerfall können Details über sqlsrv_errors() abgerufen werden.

Beispiele

Einfache Transaktion mit Commit

<?php
$serverName = 'localhost';
$connectionInfo = ['Database' => 'TestDB', 'UID' => 'sa', 'PWD' => 'secret'];
$conn = sqlsrv_connect($serverName, $connectionInfo);

if ($conn === false) {
    die('Verbindungsfehler: ' . print_r(sqlsrv_errors(), true));
}

// Transaktion starten
if (sqlsrv_begin_transaction($conn) === false) {
    die('Transaktion konnte nicht gestartet werden: ' . print_r(sqlsrv_errors(), true));
}

$sql1 = 'UPDATE Konten SET Betrag = Betrag - 100 WHERE KontoID = 1';
$sql2 = 'UPDATE Konten SET Betrag = Betrag + 100 WHERE KontoID = 2';

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

if ($stmt1 && $stmt2) {
    sqlsrv_commit($conn);
    echo 'Transaktion erfolgreich abgeschlossen.';
} else {
    sqlsrv_rollback($conn);
    echo 'Fehler — Transaktion zurückgerollt.';
    print_r(sqlsrv_errors());
}

sqlsrv_close($conn);
Transaktion erfolgreich abgeschlossen.

Transaktion mit Rollback bei Fehler

<?php
$serverName = 'localhost';
$connectionInfo = ['Database' => 'TestDB', 'UID' => 'sa', 'PWD' => 'secret'];
$conn = sqlsrv_connect($serverName, $connectionInfo);

if ($conn === false) {
    die('Verbindungsfehler.');
}

if (sqlsrv_begin_transaction($conn) === false) {
    die('Transaktion konnte nicht gestartet werden.');
}

try {
    $stmt = sqlsrv_query($conn, 'INSERT INTO Bestellungen (ProduktID, Menge) VALUES (?, ?)', [42, 3]);
    if ($stmt === false) {
        throw new RuntimeException('INSERT fehlgeschlagen: ' . print_r(sqlsrv_errors(), true));
    }

    $stmt2 = sqlsrv_query($conn, 'UPDATE Lager SET Bestand = Bestand - ? WHERE ProduktID = ?', [3, 42]);
    if ($stmt2 === false) {
        throw new RuntimeException('UPDATE fehlgeschlagen: ' . print_r(sqlsrv_errors(), true));
    }

    sqlsrv_commit($conn);
    echo 'Bestellung und Lageraktualisierung erfolgreich.';
} catch (RuntimeException $e) {
    sqlsrv_rollback($conn);
    echo 'Fehler: ' . $e->getMessage();
}

sqlsrv_close($conn);
Bestellung und Lageraktualisierung erfolgreich.

// Wichtig · Fallstricke

Verschachtelte Transaktionen: sqlsrv_begin_transaction() unterstützt keine echten verschachtelten Transaktionen. Ein erneuter Aufruf, ohne die laufende Transaktion vorher zu beenden, führt zu einem Fehler. Soll ein ähnliches Verhalten erzielt werden, können SQL-Server-Savepoints per sqlsrv_query($conn, 'SAVE TRANSACTION savepointName') genutzt werden.

Auto-Commit: Standardmäßig arbeitet die SQLSRV-Erweiterung im Auto-Commit-Modus. sqlsrv_begin_transaction() deaktiviert diesen temporär. Nach sqlsrv_commit() oder sqlsrv_rollback() wird der Auto-Commit-Modus automatisch wiederhergestellt.

Fehlerbehandlung: Im Produktivbetrieb sollte stets sqlsrv_errors() ausgewertet werden, um Transaktionsfehler frühzeitig zu erkennen und ein unbeabsichtigtes Verbleiben in einer offenen Transaktion zu vermeiden.