Not
Åtkomst till denna sida kräver auktorisation. Du kan prova att logga in eller byta katalog.
Åtkomst till denna sida kräver auktorisation. Du kan prova att byta katalog.
SQLSRV-drivrutinen för Microsoft Drivers för PHP för SQL Server innehåller tre funktioner för att utföra transaktioner:
Drivrutinen för PDO_SQLSRV innehåller tre metoder för att utföra transaktioner:
Se PDO::beginTransaction för ett exempel.
Resten av det här avsnittet förklarar och visar hur du använder SQLSRV-drivrutinen för att utföra transaktioner.
Anmärkningar
Stegen för att köra en transaktion kan sammanfattas på följande sätt:
Starta transaktionen med sqlsrv_begin_transaction.
Kontrollera om varje förfrågan som ingår i transaktionen har lyckats eller misslyckats.
Om det är lämpligt genomför du transaktionen med sqlsrv_commit. Annars återställer du transaktionen med sqlsrv_rollback. När du anropat sqlsrv_commit eller sqlsrv_rollback återställs drivrutinen till autocommit-läge.
Som standardläge är Microsoft-drivrutinerna för PHP för SQL Server i autokommitteringsläge. Det innebär att alla frågor automatiskt kommer att vara bekräftade när de lyckas, om de inte har angetts som en del av en explicit transaktion med hjälp av sqlsrv_begin_transaction.
Om en explicit transaktion inte bekräftas med sqlsrv_commit återställs den när anslutningen stängs eller skriptet avslutas.
Använd inte inbäddade Transact-SQL för att utföra transaktioner. Kör till exempel inte en instruktion med "BEGIN TRANSACTION" som en Transact-SQL-fråga för att inleda en transaktion. Det förväntade transaktionsbeteendet kan inte garanteras när du använder inbäddade Transact-SQL för att utföra transaktioner.
De sqlsrv-funktioner som anges tidigare bör användas för att utföra transaktioner.
Example
Description
I följande exempel körs flera frågor som en del av en transaktion. Om alla frågeställningar lyckas genomförs transaktionen. Om någon av frågorna misslyckas återställs transaktionen.
Exemplet försöker ta bort en försäljningsorder från tabellen Sales.SalesOrderDetail och justera produktinventeringsnivåer i tabellen Product.ProductInventory för varje produkt i försäljningsordern. Dessa frågor ingår i en transaktion eftersom alla frågor måste lyckas för att databasen ska återspegla tillståndet för beställningar och produkttillgänglighet korrekt.
Den första frågan i exemplet hämtar produkt-ID och kvantiteter för ett angivet försäljningsorder-ID. Den här frågan är inte en del av transaktionen. Skriptet avslutas dock om den här frågan misslyckas eftersom produkt-ID:t och kvantiteterna krävs för att slutföra frågor som ingår i den efterföljande transaktionen.
De efterföljande frågorna (borttagning av försäljningsordern och uppdatering av produktlagerkvantiteterna) är en del av transaktionen.
Exemplet förutsätter att SQL Server och AdventureWorks-databasen är installerade på den lokala datorn. Alla utdata skrivs till konsolen när exemplet körs från kommandoraden.
Kod
<?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
I syfte att fokusera på transaktionsbeteende ingår inte vissa rekommenderade felhantering i föregående exempel. För ett produktionsprogram rekommenderar vi att du kontrollerar eventuella anrop till en sqlsrv-funktion efter fel och hanterar dem i enlighet med detta.
Se även
Uppdatera data (Microsoft-drivrutiner för PHP för SQL Server)