隐藏

sqlsrv_begin_transaction

发布:2014/7/8 23:48:59作者:管理员 来源:本站 浏览次数:1542

在指定的连接上开始一个事务。当前事务包括指定连接上在调用 sqlsrv_begin_transaction 之后、对 sqlsrv_rollback 或 sqlsrv_commit 进行任何调用之前执行的所有语句。


Cc296151.note(zh-cn,SQL.90).gif注意:
默认情况下,SQL Server Driver for PHP 为自动提交模式。也就是说,对所有查询而言,如果未使用 sqlsrv_begin_transaction 将其指定为显式事务的一部分,则这些查询都会在成功完成后自动提交。



Cc296151.note(zh-cn,SQL.90).gif注意:
如果在连接上已经启动事务但尚未通过调用 sqlsrv_commit 或 sqlsrv_rollback 完成该事务之时调用 sqlsrv_begin_transaction,则该调用将返回 false 并将一个 Already in Transaction 错误添加到错误集合中。



sqlsrv_begin_transaction( resource $conn)

$conn:与该事务相关联的连接。

一个布尔值:如果事务成功开始,则为 true。否则为 false

作为事务的一部分,下面的示例执行两个查询。如果两个查询均成功完成,则提交事务。如果任一查询失败或这两个查询全都失败,则回滚事务。

该示例中的第一个查询将一个新的销售订单插入 AdventureWorks 数据库的 Sales.SalesOrderDetail 表中。该订单订购的是五份产品 ID 为 709 的产品。第二个查询将产品 ID 为 709 的产品库存量减少五份。这两个查询包含在一个事务中,因为这两个查询均必须成功完成,数据库才能准确反映订单状态和产品的可供应情况。

此示例假定本地计算机上已安装了 SQL Server 和 AdventureWorks 数据库。从命令行运行此示例时,所有的输出都将写入控制台。

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

为了着重介绍事务行为,上面的示例未涵盖一些建议采用的错误处理方法。对于生产应用程序,建议检查对 sqlsrv 函数的任何调用以查看是否存在错误并进行相应处理。

Cc296151.note(zh-cn,SQL.90).gif注意:
不要使用嵌入式 Transact-SQL 来执行事务。例如,不要通过将包含“BEGIN TRANSACTION”的语句作为 Transact-SQL 查询执行来开始一个事务。使用嵌入式 Transact-SQL 执行事务时,无法保证出现预期的事务行为。