Signatur
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
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);
?>
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);
?>
// 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.