Start · Sprachen · PHP · Referenz · sqlsrv_commit

sqlsrv_commit

Funktion

Bestätigt (committet) eine zuvor mit <code>sqlsrv_begin_transaction()</code> begonnene Transaktion und macht alle Änderungen dauerhaft.

seit PHP 1.0.0 Kategorie: db

Signatur

sqlsrv_commit(resource $conn): bool

Beschreibung

sqlsrv_commit() schließt eine aktive Transaktion auf einer Microsoft-SQL-Server-Verbindung erfolgreich ab und persistiert alle innerhalb dieser Transaktion vorgenommenen Datenbankänderungen. Die Funktion setzt voraus, dass zuvor sqlsrv_begin_transaction() aufgerufen wurde.

Transaktionen sind essenziell für die Datenkonsistenz: Mehrere SQL-Anweisungen können als atomare Einheit behandelt werden – entweder werden alle Änderungen übernommen (Commit) oder alle werden rückgängig gemacht (Rollback). Tritt ein Fehler auf, sollte statt sqlsrv_commit() die Funktion sqlsrv_rollback() aufgerufen werden.

Nach einem erfolgreichen Commit kehrt die Verbindung in den Auto-Commit-Modus zurück, sofern dies dem Standard-Verhalten des Treibers entspricht. Eine neue Transaktion muss explizit wieder mit sqlsrv_begin_transaction() gestartet werden.

Diese Funktion gehört zur SQLSRV-Extension (Microsoft SQL Server Driver für PHP) und ist für den Einsatz mit Microsoft SQL Server und Azure SQL konzipiert.

Parameter

Name Typ Default Beschreibung
$conn Pflicht resource Eine aktive SQLSRV-Verbindungsressource, die mit sqlsrv_connect() erstellt wurde und auf der zuvor sqlsrv_begin_transaction() aufgerufen wurde.

Rückgabewert

Typ
bool
Beschreibung
Gibt true zurück, wenn die Transaktion erfolgreich bestätigt wurde. Bei einem Fehler (z. B. keine aktive Transaktion oder Verbindungsfehler) wird false zurückgegeben. Fehlerdetails können mit sqlsrv_errors() abgefragt werden.

Beispiele

Einfacher Transaktions-Commit bei Kontoübertragung

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

if ($conn === false) {
    die('Verbindung fehlgeschlagen: ' . 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 Saldo = Saldo - 500 WHERE KontoID = 1";
$sql2 = "UPDATE Konten SET Saldo = Saldo + 500 WHERE KontoID = 2";

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

if ($stmt1 === false || $stmt2 === false) {
    // Fehler: Rollback durchführen
    sqlsrv_rollback($conn);
    die('Transaktion zurückgerollt: ' . print_r(sqlsrv_errors(), true));
}

// Erfolg: Transaktion bestätigen
if (sqlsrv_commit($conn) === false) {
    die('Commit fehlgeschlagen: ' . print_r(sqlsrv_errors(), true));
}

echo 'Übertragung erfolgreich durchgeführt.';

sqlsrv_free_stmt($stmt1);
sqlsrv_free_stmt($stmt2);
sqlsrv_close($conn);
?>
Übertragung erfolgreich durchgeführt.

Transaktion mit Fehlerbehandlung per try/catch-Muster

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

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

sqlsrv_begin_transaction($conn);

$bestellungSql = "INSERT INTO Bestellungen (KundeID, Betrag) VALUES (?, ?)";
$params = [42, 199.99];
$stmt = sqlsrv_query($conn, $bestellungSql, $params);

$lagerSql = "UPDATE Lager SET Menge = Menge - 1 WHERE ArtikelID = ?";
$stmt2 = sqlsrv_query($conn, $lagerSql, [7]);

if ($stmt !== false && $stmt2 !== false) {
    if (sqlsrv_commit($conn)) {
        echo 'Bestellung und Lagerupdate erfolgreich gespeichert.';
    } else {
        echo 'Commit fehlgeschlagen.';
        sqlsrv_rollback($conn);
    }
} else {
    echo 'Fehler bei einer SQL-Anweisung – Rollback wird durchgeführt.';
    sqlsrv_rollback($conn);
}

sqlsrv_close($conn);
?>
Bestellung und Lagerupdate erfolgreich gespeichert.

// Wichtig · Fallstricke

Wichtig: sqlsrv_commit() darf nur aufgerufen werden, wenn zuvor sqlsrv_begin_transaction() erfolgreich aufgerufen wurde. Ein Commit ohne aktive Transaktion führt zu einem Fehler.

Im Fehlerfall sollte immer sqlsrv_rollback() aufgerufen werden, um die Datenbank in einem konsistenten Zustand zu halten und Locks freizugeben. Es empfiehlt sich, die Fehlerbehandlung konsequent nach jedem SQL-Aufruf zu prüfen.

Lange offene Transaktionen können auf dem SQL-Server zu Sperrkonflikten (Deadlocks) führen und die Leistung anderer Abfragen beeinträchtigen. Transaktionen sollten daher so kurz wie möglich gehalten werden.