Nota
O acesso a esta página requer autorização. Podes tentar iniciar sessão ou mudar de diretório.
O acesso a esta página requer autorização. Podes tentar mudar de diretório.
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:
Inicie a transação com sqlsrv_begin_transaction.
Verifique o sucesso ou fracasso de cada consulta que faz parte da transação.
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)