方法:トランザクションを実行する

PHP ドライバーのダウンロード

Microsoft SQL Server 用 Drivers for PHP の SQLSRV ドライバーには、トランザクションを実行する 3 つの関数があります。

PDO_SQLSRV ドライバーには、トランザクションを実行する 3 つの方法があります。

例については、「 PDO::beginTransaction 」を参照してください。

このトピックの後半では、SQLSRV ドライバーを使用してトランザクションを実行する方法を説明し、例を示します。

解説

トランザクションを実行する手順の概要は次のとおりです。

  1. sqlsrv_begin_transaction を使用してトランザクションを開始します。

  2. トランザクションに含まれる各クエリの成功または失敗を確認します。

  3. 必要に応じて、 sqlsrv_commitを使用してトランザクションを開始します。 コミットしない場合、 sqlsrv_rollbackを使用してトランザクションを開始します。 sqlsrv_commit または sqlsrv_rollback を呼び出した後、ドライバーは自動コミット モードに戻ります。

    Microsoft SQL Server 用 Drivers for PHP は、既定で自動コミット モードです。 これは、すべてのクエリは、 sqlsrv_begin_transactionを使用してトランザクションを開始します。

    sqlsrv_commit を使用して明示的なトランザクションをコミットしない場合、接続の終了時またはスクリプトの終了時にロールバックされます。

    トランザクションの実行に、埋め込みの Transact SQL を使用しないでください。 たとえば、トランザクションを開始するために、"BEGIN TRANSACTION" を Transact-SQL クエリとして使用してステートメントを実行しないでください。 埋め込みの Transact-SQL を使用してトランザクションを実行した場合、予測されるトランザクションの動作は保証できません。

    トランザクションを実行するには、前述の sqlsrv 関数を使用する必要があります。

説明

次の例では、トランザクションの一部としていくつかのクエリを実行します。 すべてのクエリが成功すると、トランザクションはコミットされます。 いずれかのクエリが失敗すると、トランザクションはロールバックされます。

この例では、 Sales.SalesOrderDetail テーブルから販売注文を削除し、販売注文の各製品について Product.ProductInventory テーブルの製品インベントリ レベルを調整します。 データベースに注文および製品の入手の状態を正確に反映するには、これらのクエリすべてが成功する必要があるため、トランザクションに含まれています。

この例の最初のクエリでは、指定された販売注文 ID の製品 ID と数量を取得します。 このクエリは、トランザクションの一部ではありません。 ただし、以降のトランザクションに含まれるクエリを完了するために製品 ID と数量が必要なので、このクエリが失敗すると、スクリプトは終了します。

これらのクエリ (販売注文の削除と、製品在庫の数量の更新) の成功は、トランザクションの一部です。

この例では、ローカル コンピューターに 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));  
}  
  
/* Begin transaction. */  
if( sqlsrv_begin_transaction($conn) === false )   
{   
     echo "Could not begin transaction.\n";  
     die( print_r( sqlsrv_errors(), true));  
}  
  
/* Set the Order ID.  */  
$orderId = 43667;  
  
/* Execute operations that are part of the transaction. Commit on  
success, roll back on failure. */  
if (perform_trans_ops($conn, $orderId))  
{  
     //If commit fails, roll back the transaction.  
     if(sqlsrv_commit($conn))  
     {  
         echo "Transaction committed.\n";  
     }  
     else  
     {  
         echo "Commit failed - rolling back.\n";  
         sqlsrv_rollback($conn);  
     }  
}  
else  
{  
     "Error in transaction operation - rolling back.\n";  
     sqlsrv_rollback($conn);  
}  
  
/*Free connection resources*/  
sqlsrv_close( $conn);  
  
/*----------------  FUNCTION: perform_trans_ops  -----------------*/  
function perform_trans_ops($conn, $orderId)  
{  
    /* Define query to update inventory based on sales order info. */  
    $tsql1 = "UPDATE Production.ProductInventory   
              SET Quantity = Quantity + s.OrderQty   
              FROM Production.ProductInventory p   
              JOIN Sales.SalesOrderDetail s   
              ON s.ProductID = p.ProductID   
              WHERE s.SalesOrderID = ?";  
  
    /* Define the parameters array. */  
    $params = array($orderId);  
  
    /* Execute the UPDATE statement. Return false on failure. */  
    if( sqlsrv_query( $conn, $tsql1, $params) === false ) return false;  
  
    /* Delete the sales order. Return false on failure */  
    $tsql2 = "DELETE FROM Sales.SalesOrderDetail   
              WHERE SalesOrderID = ?";  
    if(sqlsrv_query( $conn, $tsql2, $params) === false ) return false;  
  
    /* Return true because all operations were successful. */  
    return true;  
}  
?>  

コメント

トランザクションの動作を重視するため、いくつかの推奨されるエラー処理は前の例には含まれていません。 実稼働アプリケーションでは、sqlsrv 関数のすべての呼び出しについてエラーを確認し、それに応じて処理することをお勧めします。

参照

データの更新 (Microsoft Drivers for PHP for SQL Server)

トランザクション (データベース エンジン)

ドキュメントのコード例について