カーソルと準備されたステートメントでのトランザクションの影響

トランザクションをコミットまたはロールバックすると、カーソルとアクセス プランに次のいずれかの影響があります。

  • すべてのカーソルが閉じられ、その接続で準備されたステートメントのアクセス プランが削除されます。

  • すべてのカーソルが閉じられ、その接続で準備されたステートメントのアクセス プランはそのまま残ります。

  • すべてのカーソルは開いたままであり、その接続で準備されたステートメントのアクセス プランはそのまま残ります。

たとえば、データ ソースがこの一覧の最初の動作を示し、これらの動作の中で最も制限が厳しいとします。 次に、アプリが次の処理を行う場合を想定します。

  1. コミット モードを手動コミットに設定します。

  2. 明細 1 の販売注文の結果セットを作成します。

  3. ユーザーがその注文を強調表示したときに、ステートメント 2 の販売注文の行の結果セットを作成します。

  4. SQLExecute を呼び出して、ユーザーが行を更新するときに、ステートメント 3 で準備された位置指定の更新ステートメントを実行します。

  5. SQLEndTran を呼び出して、配置された update ステートメントをコミットします。

データ ソースの動作により、手順 5 で SQLEndTran を呼び出すと、ステートメント 1 と 2 のカーソルが閉じられ、すべてのステートメントのアクセス プランが削除されます。 結果セットを再作成し、ステートメント 3 でステートメントを再表示するには、アプリでステートメント 1 と 2 を再実行する必要があります。

自動コミット モードでは、SQLEndTran コミット トランザクション以外の関数は次のようになります。

  • SQLExecute または SQLExecDirect 前の例では、手順 4 で SQLExecute を呼び出すとトランザクションがコミットされます。 これにより、データ ソースはステートメント 1 と 2 のカーソルを閉じ、その接続のすべてのステートメントのアクセス プランを削除します。

  • 前の例の SQLBulkOperations または SQLSetPos では、ステートメント 3 で配置された更新ステートメントを実行するのではなく、手順 4 で SQLSetPos をステートメント 2 のSQL_UPDATE オプションで呼び出したとします。 これにより、トランザクションがコミットされ、データ ソースがステートメント 1 と 2 のカーソルを閉じ、その接続上のすべてのアクセス プランが破棄されます。

  • SQLCloseCursor 前の例では、ユーザーが別の販売注文を強調表示すると、新しい販売注文の行の結果を作成する前に、アプリがステートメント 2 で SQLCloseCursor を呼び出すとします。 SQLCloseCursor を呼び出すと、行の結果セットを作成した SELECT ステートメントがコミットされ、データ ソースがステートメント 1 のカーソルを閉じ、その接続のすべてのアクセス プランが破棄されます。

アプリ(特に、ユーザーが結果セットをスクロールして行を更新または削除する画面ベースのアプリ)は、この動作に関するコードに注意する必要があります。

トランザクションがコミットまたはロールバックされたときにデータ ソースがどのように動作するかを判断するために、アプリは、SQL_CURSOR_COMMIT_BEHAVIOR オプションと SQL_CURSOR_ROLLBACK_BEHAVIOR オプションを使用して SQLGetInfo を呼び出します。