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