Megjegyzés
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhat bejelentkezni vagy módosítani a címtárat.
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhatja módosítani a címtárat.
Az SQL ServerHEZ készült PHP-hez készült Microsoft Drivers SQLSRV-illesztője három függvényt biztosít a tranzakciók végrehajtásához:
A PDO_SQLSRV illesztőprogram három módszert biztosít a tranzakciók végrehajtásához:
Lásd a PDO::beginTransaction példát.
A témakör további része ismerteti és bemutatja, hogyan használható az SQLSRV-illesztő a tranzakciók végrehajtásához.
Megjegyzések
A tranzakciók végrehajtásának lépései az alábbiak szerint foglalhatók össze:
Kezdje a tranzakciót sqlsrv_begin_transaction.
Ellenőrizze a tranzakció részét képező lekérdezések sikerességét vagy sikertelenségét.
Szükség esetén véglegesítse a tranzakciót sqlsrv_commit. Ellenkező esetben állítsa vissza a tranzakciót a sqlsrv_rollback segítségével. A sqlsrv_commit vagy sqlsrv_rollback hívása után az illesztőprogram automatikus véglegesítési módba kerül.
Alapértelmezés szerint a Microsoft PHP-illesztőprogramok az SQL Serverhez automatikus véglegesítési módban futnak. Ez azt jelenti, hogy a rendszer minden lekérdezést automatikusan véglegesíteni fog a sikeres végrehajtáskor, kivéve, ha azokat explicit tranzakció részeként jelölték ki sqlsrv_begin_transaction használatával.
Ha egy explicit tranzakciót nem rögzítenek a sqlsrv_commit paranccsal, a kapcsolat bezárásakor vagy a szkript leállításakor visszaállításra kerül.
Ne használjon beágyazott Transact-SQL tranzakciók végrehajtásához. Például ne hajtsa végre a "BEGIN TRANSACTION" utasítást Transact-SQL lekérdezésként a tranzakció elindításához. A várt tranzakciós viselkedés nem garantálható, ha beágyazott Transact-SQL használ tranzakciók végrehajtásához.
A tranzakciók végrehajtásához a korábban felsorolt sqlsrv függvényeket kell használni.
Example
Description
Az alábbi példa több lekérdezést hajt végre egy tranzakció részeként. Ha az összes lekérdezés sikeres, a tranzakció véglegesítése megtörtént. Ha bármelyik lekérdezés meghiúsul, a tranzakció vissza lesz állítva.
A példa megpróbál törölni egy értékesítési rendelést a Sales.SalesOrderDetail táblából, és módosítani a Product.ProductInventory táblában lévő termékleltár-szinteket az értékesítési rendelés minden egyes termékéhez. Ezek a lekérdezések azért szerepelnek egy tranzakcióban, mert minden lekérdezésnek sikeresnek kell lennie ahhoz, hogy az adatbázis pontosan tükrözze a rendelések állapotát és a termék rendelkezésre állását.
A példában szereplő első lekérdezés egy megadott értékesítési rendelés azonosítójának termékazonosítóit és mennyiségét kéri le. Ez a lekérdezés nem része a tranzakciónak. A szkript azonban akkor fejeződik be, ha a lekérdezés meghiúsul, mert a termékazonosítókra és mennyiségekre van szükség a későbbi tranzakció részét képező lekérdezések elvégzéséhez.
Az ezt követő lekérdezések (az értékesítési rendelés törlése és a termékleltár-mennyiségek frissítése) a tranzakció részét képezik.
A példa feltételezi, hogy az SQL Server és az AdventureWorks adatbázis telepítve van a helyi számítógépen. A rendszer minden kimenetet a konzolra ír, amikor a példa a parancssorból fut.
Kód
<?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
A tranzakciós viselkedésre való összpontosítás érdekében az előző példában nem szerepel néhány javasolt hibakezelés. Éles alkalmazások esetén javasoljuk, hogy ellenőrizze az sqlsrv függvények hibáit, és ennek megfelelően kezelje őket.
Lásd még:
Adatok frissítése (Microsoft Drivers for PHP for SQL Server)