sqlsrv_begin_transaction

Beginnt eine Transaktion für eine angegebene Verbindung. Die aktuelle Transaktion umfasst alle Anweisungen für die angegebene Verbindung, die nach dem Aufruf von sqlsrv_begin_transaction und vor einem Aufruf von sqlsrv_rollback oder sqlsrv_commit ausgeführt wurden.

Hinweis

SQL Server-Treiber für PHP befindet sich standardmäßig im Auto-Commit-Modus. Dies bedeutet, dass für alle erfolgreich ausgeführten Abfragen automatisch ein Commit ausgeführt wird, sofern sie nicht mit sqlsrv_begin_transaction explizit einer Transaktion hinzugefügt wurden.

Hinweis

Wenn sqlsrv_begin_transaction aufgerufen wird, nachdem eine Transaktion für die Verbindung initialisiert, diese aber noch nicht durch Aufrufen von sqlsrv_commit oder sqlsrv_rollback abgeschlossen wurde, gibt der Aufruf false zurück, und der Fehlerauflistung wird ein Already in Transaction-Fehler hinzugefügt.

Syntax

sqlsrv_begin_transaction( resource $conn)

Parameter

$conn: Die Verbindung, der die Transaktion zugeordnet ist.

Rückgabewert

Ein boolescher Wert: true, wenn die Transaktion erfolgreich gestartet wurde. Andernfalls false.

Beispiel

Im folgenden Beispiel werden zwei Abfragen im Rahmen einer Transaktion ausgeführt. Wenn beide Abfragen erfolgreich ausgeführt werden, wird für die Transaktion ein Commit ausgeführt. Wenn eine Abfrage fehlschlägt oder beide Abfragen fehlschlagen, wird ein Rollback für die Transaktion ausgeführt.

Die erste Abfrage im Beispiel fügt einen neuen Auftrag in die Sales.SalesOrderDetail-Tabelle der AdventureWorks-Datenbank ein. Der Auftrag umfasst fünf Einheiten des Produkts mit dem ProductID-Wert 709. Mit der zweiten Abfrage wird der Lagerbestand des Produkts mit dem ProductID-Wert 709 um fünf Einheiten reduziert. Diese Abfragen werden in eine Transaktion aufgenommen, weil die Datenbank den Status der Aufträge und die Verfügbarkeit der Produkte nur dann korrekt widerspiegelt, wenn beide Abfragen erfolgreich ausgeführt wurden.

Im Beispiel wird davon ausgegangen, dass SQL Server und die AdventureWorks-Datenbank auf dem lokalen Computer installiert sind. Alle Ausgaben werden in die Konsole geschrieben, wenn das Beispiel über die Befehlszeile ausgeführt wird.

<?php
/* Connect to the local server using Windows Authentication and
specify the AdventureWorks database as the database in use. */
$serverName = "(local)";
$connectionInfo = array( "Database"=>"AdventureWorks");
$conn = sqlsrv_connect( $serverName, $connectionInfo);
if( $conn === false )
{
     echo "Could not connect.\n";
     die( print_r( sqlsrv_errors(), true ));
}

/* Initiate transaction. */
/* Exit script if transaction cannot be initiated. */
if ( sqlsrv_begin_transaction( $conn ) === false )
{
     echo "Could not begin transaction.\n";
     die( print_r( sqlsrv_errors(), true ));
}

/* Initialize parameter values. */
$orderId = 43659; $qty = 5; $productId = 709;
$offerId = 1; $price = 5.70;

/* Set up and execute the first query. */
$tsql1 = "INSERT INTO Sales.SalesOrderDetail 
                     (SalesOrderID, 
                      OrderQty, 
                      ProductID, 
                      SpecialOfferID, 
                      UnitPrice)
          VALUES (?, ?, ?, ?, ?)";
$params1 = array( $orderId, $qty, $productId, $offerId, $price);
$stmt1 = sqlsrv_query( $conn, $tsql1, $params1 );

/* Set up and execute the second query. */
$tsql2 = "UPDATE Production.ProductInventory 
          SET Quantity = (Quantity - ?) 
          WHERE ProductID = ?";
$params2 = array($qty, $productId);
$stmt2 = sqlsrv_query( $conn, $tsql2, $params2 );

/* If both queries were successful, commit the transaction. */
/* Otherwise, rollback the transaction. */
if( $stmt1 && $stmt2 )
{
     sqlsrv_commit( $conn );
     echo "Transaction was committed.\n";
}
else
{
     sqlsrv_rollback( $conn );
     echo "Transaction was rolled back.\n";
}

/* Free statement and connection resources. */
sqlsrv_free_stmt( $stmt1);
sqlsrv_free_stmt( $stmt2);
sqlsrv_close( $conn);
?>

Weil hier das Transaktionsverhalten im Vordergrund steht, wurden im obigen Beispiel einige empfohlene Fehlerbehandlungsroutinen weggelassen. Für eine Anwendung in einer Produktionsumgebung wird empfohlen, dass jeder Aufruf der sqlsrv-Funktion auf Fehler überprüft und entsprechend behandelt wird.

Hinweis

Verwenden Sie kein eingebettetes Transact-SQL zur Ausführung von Transaktionen. Führen Sie beispielsweise keine Anweisung mit "BEGIN TRANSACTION" als Transact-SQL-Abfrage aus, um eine Transaktion zu beginnen. Wenn eingebettetes Transact-SQL zur Ausführung von Transaktionen verwendet wird, ist das erwartete Transaktionsverhalten nicht gewährleistet.

Siehe auch

Aufgaben

Vorgehensweise: Durchführen von Transaktionen

Weitere Ressourcen

API-Referenz (SQL Server-Treiber für PHP)
Einführung in den SQL Server-Treiber für PHP