sqlsrv_rollback
Revierte la transacción actual en la conexión especificada y devuelve la conexión al modo de confirmación automática. La transacción actual incluye en la conexión especificada todas las instrucciones que se han ejecutado después de llamar a sqlsrv_begin_transaction y antes de llamar a sqlsrv_rollback o sqlsrv_commit.
Nota
De manera predeterminada, el Controlador de SQL Server para PHP está en modo de confirmación automática. Esto indica que todas las consultas se confirman de forma automática cuando se realizan correctamente a menos que se hayan designado como parte de una transacción explícita mediante sqlsrv_begin_transaction.
Nota
Si se llama a sqlsrv_rollback en una conexión que no está en una transacción activa que se inició con sqlsrv_begin_transaction, la llamada devuelve false y se agrega un error Not in Transaction a la colección de errores.
Sintaxis
sqlsrv_rollback( resource $conn)
Parámetros
$conn: la conexión con la que se activa la transacción.
Valor devuelto
Un valor booleano: true si la transacción se revierte correctamente. En caso contrario, false.
Ejemplo
En el ejemplo siguiente se ejecutan dos consultas como parte de una transacción. Si ambas consultas son correctas, la transacción se confirma. Si se produce un error en una de las consultas (o en ambas), se revierte la transacción.
La primera consulta en el ejemplo inserta un nuevo pedido de venta en la tabla Sales.SalesOrderDetail de la base de datos AdventureWorks. Se trata de un pedido de cinco unidades del producto Id. 709. La segunda consulta reduce la cantidad de existencias del producto Id. 709 en cinco unidades. Estas consultas se incluyen en una transacción debido a que ambas deben ser correctas para que la base de datos refleje con precisión el estado de los pedidos y la disponibilidad del producto.
En el ejemplo se supone que SQL Server y la base de datos AdventureWorks están instalados en el equipo local. Todos los resultados se escriben en la consola cuando el ejemplo se ejecuta desde la línea de comandos.
<?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 ));
}
/* Initiate transaction. */
/* Exit script if transaction cannot be initiated. */
if ( sqlsrv_begin_transaction( $conn) === false )
{
echo "Could not begin transaction.\n";
die( print_r( sqlsrv_errors(), true ));
}
/* Initialize parameter values. */
$orderId = 43659; $qty = 5; $productId = 709;
$offerId = 1; $price = 5.70;
/* Set up and execute the first query. */
$tsql1 = "INSERT INTO Sales.SalesOrderDetail
(SalesOrderID,
OrderQty,
ProductID,
SpecialOfferID,
UnitPrice)
VALUES (?, ?, ?, ?, ?)";
$params1 = array( $orderId, $qty, $productId, $offerId, $price);
$stmt1 = sqlsrv_query( $conn, $tsql1, $params1 );
/* Set up and executee the second query. */
$tsql2 = "UPDATE Production.ProductInventory
SET Quantity = (Quantity - ?)
WHERE ProductID = ?";
$params2 = array($qty, $productId);
$stmt2 = sqlsrv_query( $conn, $tsql2, $params2 );
/* If both queries were successful, commit the transaction. */
/* Otherwise, rollback the transaction. */
if( $stmt1 && $stmt2 )
{
sqlsrv_commit( $conn );
echo "Transaction was committed.\n";
}
else
{
sqlsrv_rollback( $conn );
echo "Transaction was rolled back.\n";
}
/* Free statement and connection resources. */
sqlsrv_free_stmt( $stmt1);
sqlsrv_free_stmt( $stmt2);
sqlsrv_close( $conn);
?>
Con el fin de centrarse en el comportamiento de las transacciones, en el ejemplo anterior no se incluyen algunos controles de errores recomendados. Para una aplicación de producción, se recomienda que cualquier llamada a una función sqlsrv compruebe si hay errores y los trate en consecuencia.
Nota
No use Transact-SQL incrustado para realizar transacciones. Por ejemplo, no ejecute una instrucción con "BEGIN TRANSACTION" como consulta de Transact-SQL para comenzar una transacción. No se puede garantizar el comportamiento transaccional esperado cuando se usa Transact-SQL incrustado para realizar transacciones.
Vea también
Tareas
Otros recursos
Referencia de la API (Controlador SQL Server para PHP)
Presentación del controlador de SQL Server para PHP