Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
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:
Zahajte transakci s pomocí sqlsrv_begin_transaction.
Zkontrolujte úspěch nebo selhání každého dotazu, který je součástí transakce.
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)