Share via


sqlsrv_commit

認可指定之連接上的目前交易,並傳回自動認可模式的連接。目前交易包含指定之連接上在呼叫 sqlsrv_begin_transaction 之後及任何 sqlsrv_rollbacksqlsrv_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 資料表。此訂單適用於產品識別碼為 709 的五個單位產品。第二個查詢會將產品識別碼 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 簡介