sqlsrv_commit
提交指定连接上的当前事务,并使该连接返回到自动提交模式。当前事务包括指定连接上在调用 sqlsrv_begin_transaction 之后、对 sqlsrv_rollback 或 sqlsrv_commit 进行任何调用之前执行的所有语句。
备注
默认情况下,SQL Server Driver for PHP 为自动提交模式。也就是说,对所有查询而言,如果未使用 sqlsrv_begin_transaction 将其指定为显式事务的一部分,则这些查询都会在成功完成后自动提交。
备注
如果对不属于活动事务并且是使用 sqlsrv_begin_transaction 启动的连接调用 sqlsrv_commit,则该调用将返回 false,并向错误集合中添加一个 Not in Transaction 错误。
语法
sqlsrv_commit( 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 函数的任何调用以查看是否存在错误并进行相应处理。
备注
不要使用嵌入式 Transact-SQL 来执行事务。例如,不要通过将包含“BEGIN TRANSACTION”的语句作为 Transact-SQL 查询执行来开始一个事务。使用嵌入式 Transact-SQL 执行事务时,无法保证出现预期的事务行为。
另请参见
任务
其他资源
API 参考 (SQL Server Driver for PHP)
SQL Server Driver for PHP 介绍