PHP アプリケーションでのコミット・モード (ibm_db2)

接続リソースのコミット・モードを指定することにより、SQL ステートメントのグループがコミットされる方法を制御できます。 ibm_db2 拡張モジュールは、自動コミットと手動コミットの 2 つのコミット・モードをサポートします。

PHP でデータベース・トランザクションを制御するには、db2_connect 関数によって戻される通常の接続リソースを使用する必要があります。 持続的な接続では、常に自動コミット・モードが使用されるからです。

自動コミット・モード
自動コミット・モードでは、各 SQL ステートメントはそれだけで完結するトランザクションであり、自動的にコミットされます。 自動コミット・モードは、スケーラビリティーが必要な Web アプリケーションのパフォーマンスを阻害するロック・エスカレーションの問題を防ぐのに役立ちます。 ibm_db2 拡張モジュールは、デフォルトで、すべての接続を自動コミット・モードで開きます。

db2_autocommit($conn, DB2_AUTOCOMMIT_ON) (ここで conn は有効な接続リソース) を呼び出すことにより、一旦使用不可になった自動コミット・モードをオンにすることができます。

db2_autocommit 関数を呼び出すと、PHP とデータベース管理システムの間の追加の通信が必要となるため、PHP スクリプトのパフォーマンスが影響を受ける可能性があります。

手動コミット・モード
手動コミット・モードでは、db2_commit または db2_rollback 関数を呼び出したときにトランザクションが終了します。 つまり、トランザクションの開始から commit または rollback 関数の呼び出しまでの間に同じ接続に対して実行されるすべてのステートメントは、単一のトランザクションとして扱われます。

手動コミット・モードは、1 つ以上の SQL ステートメントを含むトランザクションをロールバックする必要がある場合に役立ちます。 複数の SQL ステートメントを 1 つのトランザクション内で発行し、明示的にトランザクションをコミットまたはロールバックせずにスクリプトが終了する場合には、ibm_db2 拡張モジュールはトランザクション内で実行されたすべての作業を自動的にロールバックします。

db2_connect オプション配列の "AUTOCOMMIT" => DB2_AUTOCOMMIT_OFF 設定を使用してデータベース接続を作成するときに、自動コミット・モードをオフにすることができます。 db2_autocommit($conn, DB2_AUTOCOMMIT_OFF)を呼び出すことによって、既存の接続リソースの自動コミット・モードをオフにすることもできます。ここで、 conn は有効な接続リソースです。

ibm_db2 API について詳しくは、 http://www.php.net/docs.phpを参照してください。

db2_commit または db2_rollback が呼び出されたときにトランザクションを終了します。

$conn = db2_connect('SAMPLE', 'db2inst1', 'ibmdb2', array(
  'AUTOCOMMIT' => DB2_AUTOCOMMIT_ON));

// Issue one or more SQL statements within the transaction
$result = db2_exec($conn, 'DELETE FROM TABLE employee');
if ($result === FALSE) {
  print '<p>Unable to complete transaction!</p>';
  db2_rollback($conn);
}
else {
  print '<p>Successfully completed transaction!</p>';
  db2_commit($conn);
}