sqlsrv_begin_transaction

指定された接続でトランザクションを開始します。現在のトランザクションには、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" エラーがエラー コレクションに追加されます。

構文

sqlsrv_begin_transaction( resource $conn)

パラメータ

$conn: トランザクションが関連付けられている接続。

戻り値

ブール値 : トランザクションが正常に開始された場合は true。それ以外の場合は false

次の例では、2 つのクエリをトランザクションの一部として実行します。両方のクエリが成功した場合、トランザクションがコミットされます。クエリのいずれか (またはその両方) が失敗した場合、トランザクションがロールバックされます。

この例の最初のクエリでは、AdventureWorks データベースの Sales.SalesOrderDetail テーブルに、新しい販売注文を挿入します。ID 709 の製品 5 単位の注文です。2 番目のクエリでは、製品 ID 709 の在庫数量を 5 単位分減らします。これらのクエリを 1 つのトランザクションに含めているのは、注文の状態と製品の入手可能性をデータベースに正確に反映させるには、両方のクエリが成功する必要があるためです。

この例では、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 の概要