Sdílet prostřednictvím


Postupy: Provádění transakcí

Stáhnout ovladač PHP

Ovladač SQLSRV ovladačů Microsoftu pro PHP pro SQL Server poskytuje tři funkce pro provádění transakcí:

Ovladač PDO_SQLSRV poskytuje tři metody pro provádění transakcí:

Příklad najdete v souboru PDO::beginTransaction .

Zbývající část tohoto tématu vysvětluje a ukazuje, jak použít ovladač SQLSRV k provádění transakcí.

Poznámky

Kroky pro provedení transakce lze shrnout následujícím způsobem:

  1. Zahajte transakci s pomocí sqlsrv_begin_transaction.

  2. Zkontrolujte úspěch nebo selhání každého dotazu, který je součástí transakce.

  3. V případě potřeby potvrďte transakci s sqlsrv_commit. V opačném případě vraťte transakci pomocí sqlsrv_rollback. Po volání sqlsrv_commit nebo sqlsrv_rollback se ovladač vrátí do režimu automatického potvrzení.

    Ve výchozím nastavení jsou ovladače Microsoftu pro PHP pro SQL Server v režimu automatického potvrzení. To znamená, že všechny dotazy jsou automaticky potvrzeny při úspěchu, pokud nebyly určeny jako součást explicitní transakce pomocí sqlsrv_begin_transaction.

    Pokud explicitní transakce není potvrzena pomocí funkce sqlsrv_commit, vrátí se zpět po zavření připojení nebo ukončení skriptu.

    Nepoužívejte vložené Transact-SQL k provádění transakcí. Například nespouštět příkaz s "BEGIN TRANSACTION" jako Transact-SQL dotaz pro zahájení transakce. Očekávané transakční chování nelze zaručit, pokud k provádění transakcí použijete vložené Transact-SQL.

    Funkce sqlsrv uvedené dříve by měly být použity k provádění transakcí.

Example

Description

Následující příklad provádí několik dotazů jako součást transakce. Pokud jsou všechny dotazy úspěšné, transakce je potvrzena. Pokud některý z dotazů selže, transakce se vrátí zpět.

Příklad se pokusí odstranit prodejní objednávku z tabulky Sales.SalesOrderDetail a upravit úrovně skladových zásob produktů v tabulce Product.ProductInventory pro každý produkt v prodejní objednávce. Tyto dotazy jsou zahrnuty do transakce, protože všechny dotazy musí být úspěšné, aby databáze přesně odrážela stav objednávek a dostupnosti produktů.

První dotaz v příkladu načte ID produktů a množství pro zadané ID prodejní objednávky. Tento dotaz není součástí transakce. Skript však skončí, pokud tento dotaz selže, protože ID produktů a množství jsou vyžadovány k dokončení dotazů, které jsou součástí následné transakce.

Následující dotazy (odstranění prodejní objednávky a aktualizace množství zásob produktů) jsou součástí transakce.

Příklad předpokládá, že SQL Server a databáze AdventureWorks jsou nainstalovány v místním počítači. Při spuštění příkladu z příkazového řádku se veškerý výstup zapíše do konzoly.

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

Pro účely zaměření na chování transakcí některé doporučené zpracování chyb není součástí předchozího příkladu. V případě produkční aplikace doporučujeme zkontrolovat případné volání funkce sqlsrv , jestli neobsahují chyby a odpovídajícím způsobem je zpracovávají.

Viz také

Aktualizace dat (ovladače Microsoftu pro PHP pro SQL Server)

Transakce (databázový stroj)

Příklady kódu v dokumentaci