发布:2014/7/8 23:48:59作者:管理员 来源:本站 浏览次数:1542
在指定的连接上开始一个事务。当前事务包括指定连接上在调用 sqlsrv_begin_transaction 之后、对 sqlsrv_rollback 或 sqlsrv_commit 进行任何调用之前执行的所有语句。
注意: |
---|
默认情况下,SQL Server Driver for PHP 为自动提交模式。也就是说,对所有查询而言,如果未使用 sqlsrv_begin_transaction 将其指定为显式事务的一部分,则这些查询都会在成功完成后自动提交。
|
注意: |
---|
如果在连接上已经启动事务但尚未通过调用 sqlsrv_commit 或 sqlsrv_rollback 完成该事务之时调用 sqlsrv_begin_transaction,则该调用将返回 false 并将一个 Already in Transaction 错误添加到错误集合中。
|
作为事务的一部分,下面的示例执行两个查询。如果两个查询均成功完成,则提交事务。如果任一查询失败或这两个查询全都失败,则回滚事务。
该示例中的第一个查询将一个新的销售订单插入 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 执行事务时,无法保证出现预期的事务行为。
|
© Copyright 2014 - 2024 柏港建站平台 ejk5.com. 渝ICP备16000791号-4