Udostępnij przez


Instrukcje: wykonywanie transakcji

Pobieranie sterownika PHP

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:

  1. Rozpocznij transakcję przy użyciu sqlsrv_begin_transaction.

  2. Sprawdź powodzenie lub niepowodzenie każdego zapytania będącego częścią transakcji.

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

Transakcje (aparat bazy danych)

Informacje o przykładach kodu w dokumentacji