Nuta
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować się zalogować lub zmienić katalog.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
Sterownik SQLSRV sterowników firmy Microsoft dla języka PHP dla programu SQL Server udostępnia trzy funkcje do wykonywania transakcji:
Sterownik PDO_SQLSRV udostępnia trzy metody wykonywania transakcji:
Zobacz przykład PDO::beginTransaction .
W pozostałej części tego tematu wyjaśniono i pokazano, jak używać sterownika SQLSRV do wykonywania transakcji.
Uwagi
Kroki wykonania transakcji można podsumować w następujący sposób:
Rozpocznij transakcję przy użyciu sqlsrv_begin_transaction.
Sprawdź powodzenie lub niepowodzenie każdego zapytania będącego częścią transakcji.
W razie potrzeby zatwierdź transakcję przy użyciu sqlsrv_commit. W przeciwnym razie wycofaj transakcję za pomocą sqlsrv_rollback. Po wywołaniu sqlsrv_commit lub sqlsrv_rollback sterownik jest zwracany do trybu automatycznego zatwierdzania.
Domyślnie sterowniki firmy Microsoft dla języka PHP dla programu SQL Server są w trybie automatycznego zatwierdzania. Oznacza to, że wszystkie zapytania są automatycznie zatwierdzane po pomyślnym powodzeniu, chyba że zostały wyznaczone jako część jawnej transakcji przy użyciu sqlsrv_begin_transaction.
Jeśli jawna transakcja nie zostanie zatwierdzona za pomocą sqlsrv_commit, zostanie wycofana po zamknięciu połączenia lub zakończenia skryptu.
Nie używaj osadzonych Transact-SQL do wykonywania transakcji. Na przykład nie wykonuj instrukcji z użyciem "BEGIN TRANSACTION" jako zapytania Transact-SQL do rozpoczęcia transakcji. Oczekiwane zachowanie transakcyjne nie może być gwarantowane przy używaniu wbudowanych instrukcji Transact-SQL przy wykonywaniu transakcji.
Wymienione wcześniej funkcje sqlsrv powinny być używane do wykonywania transakcji.
Example
Description
Poniższy przykład wykonuje kilka zapytań w ramach transakcji. Jeśli wszystkie zapytania zakończyły się pomyślnie, transakcja zostanie zatwierdzona. Jeśli którykolwiek z zapytań zakończy się niepowodzeniem, transakcja zostanie wycofana.
Przykład próbuje usunąć zamówienie sprzedaży z tabeli Sales.SalesOrderDetail i dostosować poziomy zapasów produktów w tabeli Product.ProductInventory dla każdego produktu w zamówieniu sprzedaży. Te zapytania są uwzględniane w transakcji, ponieważ wszystkie zapytania muszą zostać wykonane pomyślnie, aby baza danych dokładnie odzwierciedlała stan zamówień i dostępności produktu.
Pierwsze zapytanie w przykładzie pobiera identyfikatory produktów i ilości dla określonego identyfikatora zamówienia sprzedaży. To zapytanie nie jest częścią transakcji. Jednak skrypt kończy się, jeśli to zapytanie zakończy się niepowodzeniem, ponieważ identyfikatory i ilości produktów są wymagane do ukończenia zapytań będących częścią kolejnej transakcji.
Następujące zapytania (usunięcie zamówienia sprzedaży i zaktualizowanie ilości zapasów produktów) są częścią transakcji.
W tym przykładzie przyjęto założenie, że na komputerze lokalnym zainstalowano program SQL Server i bazę danych AdventureWorks . Wszystkie dane wyjściowe są zapisywane w konsoli, gdy przykład jest uruchamiany z wiersza polecenia.
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
W celu skupienia się na zachowaniu transakcji nie uwzględniono niektórych zalecanych procedur obsługi błędów w poprzednim przykładzie. W przypadku aplikacji produkcyjnej zalecamy sprawdzenie dowolnego wywołania funkcji sqlsrv pod kątem błędów i odpowiedniego ich obsługi.
Zobacz też
Aktualizowanie danych (sterowniki firmy Microsoft dla języka PHP dla programu SQL Server)