Procédure : effectuer des transactions
Le Pilote SQL Server pour PHP offre trois fonctions pour l'exécution des transactions :
Cette rubrique explique et montre comment utiliser ces fonctions pour effectuer des transactions.
Les étapes suivantes résument le processus d'exécution d'une transaction :
- sqlsrv_begin_transaction est inséré avant toutes les requêtes qui font partie de la transaction.
- Chaque requête de la transaction est vérifiée pour savoir si elle a réussi ou échoué.
- S'il y a lieu, la transaction est validée avec sqlsrv_commit. Sinon, la transaction est restaurée avec sqlsrv_rollback. Après l'appel de sqlsrv_commit ou de sqlsrv_rollback, le pilote retourne en mode de validation automatique.
![]() |
---|
Le Pilote SQL Server pour PHP est en mode de validation automatique par défaut. En d'autres termes, toutes les requêtes sont automatiquement validées en cas de réussite, à moins qu'elles ne soient désignées dans le cadre d'une transaction explicite via sqlsrv_begin_transaction. |
![]() |
---|
Si une transaction explicite n'est pas validée avec sqlsrv_commit, elle est restaurée à la fermeture de la connexion ou à la fin du script. |
![]() |
---|
N'utilisez pas le langage Transact-SQL incorporé pour effectuer des transactions. Par exemple, n'exécutez pas d'instruction avec « BEGIN TRANSACTION » en tant que requête Transact-SQL pour commencer une transaction. Le comportement transactionnel attendu ne peut pas être garanti lorsque vous utilisez le langage Transact-SQL incorporé pour effectuer des transactions. Les fonctions sqlsrv indiquées ci-dessus doivent être utilisées pour l'exécution des transactions. |
L'exemple suivant exécute plusieurs requêtes dans le cadre d'une transaction. Si toutes les requêtes réussissent, la transaction est validée. En cas d'échec de l'une des requêtes, la transaction est restaurée.
L'exemple tente de supprimer une commande client de la table Sales.SalesOrderDetail et de mettre à jour les quantités de l'inventaire de produits dans la table Product.ProductInventory pour chaque produit figurant dans la commande client. Ces requêtes sont incluses dans une transaction, car toutes les requêtes doivent être réussies pour permettre à la base de données de refléter avec précision l'état des commandes et la disponibilité des produits.
Dans l'exemple, la première requête récupère les quantités et les ID de produits pour l'ID de commande client spécifié. Bien que cette requête ne fasse pas partie de la transaction, tout échec de la requête met fin au script, car les quantités et les ID de produits sont des données requises pour l'exécution des requêtes de la transaction suivante.
Les requêtes ultérieures (suppression de la commande client et mise à jour des quantités de l'inventaire de produits) font partie de la transaction.
L'exemple suppose que SQL Server et la base de données AdventureWorks sont installés sur l'ordinateur local. Toutes les données de sortie sont écrites dans la console lorsque l'exemple est exécuté à partir de la ligne de commande.
<?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));
}
/* Begin transaction. */
if( sqlsrv_begin_transaction($conn) === false )
{
echo "Could not begin transaction.\n";
die( print_r( sqlsrv_errors(), true));
}
/* Set the Order ID. */
$orderId = 43667;
/* Execute operations that are part of the transaction. Commit on
success, roll back on failure. */
if (perform_trans_ops($conn, $orderId))
{
//If commit fails, roll back the transaction.
if(sqlsrv_commit($conn))
{
echo "Transaction committed.\n";
}
else
{
echo "Commit failed - rolling back.\n";
sqlsrv_rollback($conn);
}
}
else
{
"Error in transaction operation - rolling back.\n";
sqlsrv_rollback($conn);
}
/*Free connection resources*/
sqlsrv_close( $conn);
/*---------------- FUNCTION: perform_trans_ops -----------------*/
function perform_trans_ops($conn, $orderId)
{
/* Define query to update inventory based on sales order info. */
$tsql1 = "UPDATE Production.ProductInventory
SET Quantity = Quantity + s.OrderQty
FROM Production.ProductInventory p
JOIN Sales.SalesOrderDetail s
ON s.ProductID = p.ProductID
WHERE s.SalesOrderID = ?";
/* Define the parameters array. */
$params = array($orderId);
/* Execute the UPDATE statement. Return false on failure. */
if( sqlsrv_query( $conn, $tsql1, $params) === false ) return false;
/* Delete the sales order. Return false on failure */
$tsql2 = "DELETE FROM Sales.SalesOrderDetail
WHERE SalesOrderID = ?";
if(sqlsrv_query( $conn, $tsql2, $params) === false ) return false;
/* Return true because all operations were successful. */
return true;
}
?>
Pour mieux souligner le comportement de la transaction, certaines recommandations en matière de gestion des erreurs ne sont pas incluses dans l'exemple précédent. Pour une application de production, nous vous recommandons de rechercher les erreurs générées lors d'appels à une fonction sqlsrv et de les gérer en conséquence.
À propos des exemples de code dans la documentation