Megosztás a következőn keresztül:


Útmutató: Tranzakciók végrehajtása

PHP-illesztőprogram letöltése

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:

  1. Kezdje a tranzakciót sqlsrv_begin_transaction.

  2. Ellenőrizze a tranzakció részét képező lekérdezések sikerességét vagy sikertelenségét.

  3. 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)

Tranzakciók (adatbázismotor)

Tudnivalók a dokumentációban szereplő példakódokról