Share via


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

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

Note

アプリケーションは、SQLExecute または SQLExecDirectCOMMIT または ROLLBACK ステートメントを実行して、トランザクションをコミットまたはロールバックしないでください。 この操作の効果は未定義です。 発生する可能性のある問題には、トランザクションがアクティブになっている時点がドライバーで認識されなくなったこと、およびトランザクションをサポートしていないデータ ソースに対してこれらのステートメントが失敗することが挙げられます。 これらのアプリケーションでは、代わりに SQLEndTran を呼び出す必要があります。

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

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