トランザクションのコミットとロールバック

トランザクションを手動コミット モードでコミットまたはロールバックするには、アプリケーションが SQLEndTran を呼び出します。 トランザクションをサポートする DBMS のドライバーは、通常、 COMMIT ステートメントまたは ROLLBACK ステートメントを実行してこの関数を実装します。 接続が自動コミット モードの場合、ドライバー マネージャーは SQLEndTran を呼び出しません。アプリケーションがトランザクションのロールバックを試みた場合でも、SQL_SUCCESSを返すだけです。 トランザクションをサポートしていない DBMS のドライバーは常に自動コミット モードであるため、 SQLEndTran を実装して、何もせずにSQL_SUCCESSを返すか、まったく実装しません。

Note

アプリケーションは、SQLExecute または SQLExecDirect を使用して COMMIT ステートメントまたは ROLLBACK ステートメントを実行して、トランザクションをコミットまたはロールバックしないでください。 これを行うことの影響は未定義です。 発生する可能性のある問題には、トランザクションがアクティブになっているときにドライバーが認識しなくなったことや、トランザクションをサポートしていないデータ ソースに対してこれらのステートメントが失敗する場合などがあります。 これらのアプリケーションでは、代わりに SQLEndTran を呼び出す必要があります。

アプリケーションが環境ハンドルを SQLEndTran に渡しても接続ハンドルを渡さない場合、Driver Manager は概念的に、環境内に 1 つ以上のアクティブな接続を持つ各ドライバーの環境ハンドルを使用して SQLEndTran を呼び出します。 その後、ドライバーは環境内の各接続でトランザクションをコミットします。 ただし、ドライバーもドライバー マネージャーも、環境内の接続に対して 2 フェーズ コミットを実行しない点に注意することが重要です。これは、環境内のすべての接続に対して SQLEndTran を同時に呼び出すプログラミング上の便利さにすぎません。

( 2 フェーズ コミット は、通常、複数のデータ ソースに分散されたトランザクションをコミットするために使用されます。最初のフェーズでは、データ ソースがトランザクションの一部をコミットできるかどうかをポーリングします。2 番目のフェーズでは、トランザクションは実際にすべてのデータ ソースでコミットされます。データ ソースが最初のフェーズで応答し、トランザクションをコミットできない場合、2 番目のフェーズは発生しません)。