Compartir a través de


sqlsrv_begin_transaction

Inicia una transacción en una conexión especificada. 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 realizar ninguna llamada 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_begin_transaction después de haberse iniciado una transacción en la conexión pero sin haberse completado mediante una llamada a sqlsrv_commit o sqlsrv_rollback, la llamada devuelve false y se agrega un error Already in Transaction a la colección de errores.

Sintaxis

sqlsrv_begin_transaction( resource $conn)

Parámetros

$conn: Conexión a la que está asociada la transacción.

Valor devuelto

Un valor booleano: true si la transacción se inició 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 execute 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 siguiente 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

Cómo realizar transacciones

Otros recursos

Referencia de la API (Controlador SQL Server para PHP)
Presentación del controlador de SQL Server para PHP