Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of mappen te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen om mappen te wijzigen.
Het SQLSRV-stuurprogramma van de Microsoft-stuurprogramma's voor PHP voor SQL Server biedt drie functies voor het uitvoeren van transacties:
Het stuurprogramma PDO_SQLSRV biedt drie methoden voor het uitvoeren van transacties:
Zie PDO::beginTransaction voor een voorbeeld.
In de rest van dit onderwerp wordt uitgelegd hoe u het SQLSRV-stuurprogramma gebruikt om transacties uit te voeren.
Opmerkingen
De stappen voor het uitvoeren van een transactie kunnen als volgt worden samengevat:
Begin de transactie met sqlsrv_begin_transaction.
Controleer het slagen of mislukken van elke query die deel uitmaakt van de transactie.
Voer indien nodig de transactie door met sqlsrv_commit. Anders kunt u de transactie terugdraaien met sqlsrv_rollback. Nadat u sqlsrv_commit of sqlsrv_rollback hebt aangeroepen, wordt het stuurprogramma teruggezet naar de modus voor automatisch doorvoeren.
De Microsoft-stuurprogramma's voor PHP voor SQL Server bevinden zich standaard in de modus voor automatisch doorvoeren. Dit betekent dat alle query's automatisch worden doorgevoerd bij succes, tenzij ze zijn aangewezen als onderdeel van een expliciete transactie met behulp van sqlsrv_begin_transaction.
Als een expliciete transactie niet wordt doorgevoerd met sqlsrv_commit, wordt deze teruggedraaid bij het sluiten van de verbinding of beëindiging van het script.
Gebruik geen ingesloten Transact-SQL om transacties uit te voeren. Voer bijvoorbeeld geen instructie uit met 'BEGIN TRANSACTION' als de Transact-SQL query om een transactie te starten. Het verwachte transactionele gedrag kan niet worden gegarandeerd wanneer u ingesloten Transact-SQL gebruikt om transacties uit te voeren.
De eerder vermelde sqlsrv-functies moeten worden gebruikt om transacties uit te voeren.
Example
Description
In het volgende voorbeeld worden verschillende query's uitgevoerd als onderdeel van een transactie. Als alle query's zijn geslaagd, wordt de transactie doorgevoerd. Als een van de query's mislukt, wordt de transactie teruggedraaid.
In het voorbeeld wordt geprobeerd een verkooporder uit de tabel Sales.SalesOrderDetail te verwijderen en de productinventarisniveaus in de tabel Product.ProductInventory voor elk product in de verkooporder aan te passen. Deze query's worden opgenomen in een transactie omdat alle query's succesvol moeten zijn voor de database om de status van orders en productbeschikbaarheid nauwkeurig weer te geven.
Met de eerste query in het voorbeeld worden product-id's en hoeveelheden opgehaald voor een opgegeven verkooporder-id. Deze query maakt geen deel uit van de transactie. Het script eindigt echter als deze query mislukt omdat de product-id's en hoeveelheden nodig zijn om query's te voltooien die deel uitmaken van de volgende transactie.
De volgende query's (verwijdering van de verkooporder en het bijwerken van de hoeveelheden productinventaris) maken deel uit van de transactie.
In het voorbeeld wordt ervan uitgegaan dat SQL Server en de AdventureWorks-database op de lokale computer zijn geïnstalleerd. Alle uitvoer wordt naar de console geschreven wanneer het voorbeeld via de opdrachtregel wordt uitgevoerd.
Code
<?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;
}
?>
Comments
Voor het doel om te focussen op transactiegedrag, wordt een aantal aanbevolen foutafhandeling niet opgenomen in het vorige voorbeeld. Voor een productietoepassing raden we u aan om een aanroep naar een sqlsrv-functie te controleren op fouten en deze dienovereenkomstig te verwerken.
Zie ook
Gegevens bijwerken (Microsoft-stuurprogramma's voor PHP voor SQL Server)