Partilhar via


Como: Realizar transações

Descarregar o driver PHP

O driver SQLSRV dos Microsoft Drivers for PHP para SQL Server fornece três funções para realizar transações:

O driver PDO_SQLSRV fornece três métodos para realizar transações:

Veja PDO::beginTransaction para um exemplo.

O restante deste tópico explica e demonstra como usar o driver SQLSRV para realizar transações.

Observações

Os passos para executar uma transação podem ser resumidos da seguinte forma:

  1. Inicie a transação com sqlsrv_begin_transaction.

  2. Verifique o sucesso ou fracasso de cada consulta que faz parte da transação.

  3. Se for apropriado, comprometa a transação com sqlsrv_commit. Caso contrário, reverta a transação com sqlsrv_rollback. Após chamar sqlsrv_commit ou sqlsrv_rollback, o driver é devolvido ao modo de auto-commit.

    Por padrão, os Microsoft Drivers para PHP para SQL Server estão em modo de auto-commit. Isto significa que todas as consultas são automaticamente comprometidas após o sucesso, a menos que tenham sido designadas como parte de uma transação explícita usando sqlsrv_begin_transaction.

    Se uma transação explícita não for comprometida com sqlsrv_commit, ela é revertida após o encerramento da ligação ou terminação do script.

    Não utilize Transact-SQL embutidos para realizar transações. Por exemplo, não execute uma instrução com "INICIAR TRANSAÇÃO" como consulta Transact-SQL para iniciar uma transação. O comportamento transacional esperado não pode ser garantido quando se utiliza Transact-SQL embutidos para realizar transações.

    As funções sqlsrv listadas anteriormente devem ser usadas para realizar transações.

Example

Description

O exemplo seguinte executa várias consultas como parte de uma transação. Se todas as consultas forem bem-sucedidas, a transação é confirmada. Se alguma das consultas falhar, a transação é revertida.

O exemplo tenta eliminar uma encomenda de venda da tabela Sales.SalesOrderDetail e ajustar os níveis de inventário de produtos na tabela Product.ProductInventory para cada produto da encomenda de vendas. Estas consultas são incluídas numa transação porque todas as consultas devem ser bem-sucedidas para que a base de dados reflita com precisão o estado das encomendas e a disponibilidade do produto.

A primeira consulta no exemplo recupera IDs de produto e quantidades para um ID de ordem de venda especificado. Esta consulta não faz parte da transação. No entanto, o script termina se esta consulta falhar, pois os IDs do produto e as quantidades são necessários para completar consultas que fazem parte da transação subsequente.

As consultas subsequentes (eliminação da ordem de venda e atualização das quantidades de inventário do produto) fazem parte da transação.

O exemplo assume que o SQL Server e a base de dados AdventureWorks estão instalados no computador local. Toda a saída é escrita para a consola quando o exemplo é executado a partir da linha de comandos.

Código

<?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

Para efeitos de foco no comportamento das transações, algumas recomendações de tratamento de erros não estão incluídas no exemplo anterior. Para uma aplicação de produção, recomendamos verificar qualquer chamada a uma função sqlsrv para erros e tratá-los em conformidade.

Ver também

Atualização de Dados (Microsoft Drivers para PHP para SQL Server)

Transações (Motor de Base de Dados)

Sobre Exemplos de Código na Documentação