結果セットおよびREF CURSORに対するトランザクションのコミットの影響

文の実行およびREF CURSORの作成によって生成される結果セットの処理では、TimesTen接続でトランザクションがコミットされるときの動作と、Oracle Database接続でトランザクションがコミットされるときの動作は異なります。

OracleDataReaderオブジェクトの結果セットがオープンしているとき、TimesTenでトランザクションがコミットされると、Oracle Databaseの場合とは異なり結果セットは自動的にクローズされます。これは、明示的なコミット、自動コミット、暗黙的なコミットの場合に該当します。

TimesTenでは暗黙的なコミットは、DDL文の後に実行されます。ODP.NETでは、コマンド接続からOracleTransactionオブジェクトが事前にインスタンス化されていない状態でOracleCommandオブジェクトが実行されると、暗黙的なコミットも発生します。明示的なコミットは、CommitメソッドがOracleTransactionオブジェクトでコールされる際に発生します。いずれの場合も、トランザクションでオープンされている結果セットが完全に処理される前にTimesTen接続でコミットが発生すると、Function sequence error例外がスローされることがあります。

この動作の違いは、OracleCommandオブジェクトの実行が別のOracleCommandオブジェクトと関連付けられている結果セットの処理とインターリーブされるとき、発生する可能性が高くなります。Function sequence error例外を回避するには、結果セットの実行と処理を、OracleTransactionオブジェクトのコンテキスト内に排他的に含める必要があります。これによって、結果セットのすべての行が取得される前にコミットが発生することを回避できます。

Function sequence error例外が発生するかどうかは、OracleCommandOracleRefCursorまたはOracleDataReaderオブジェクトのFetchSizeプロパティの値によって異なります。FetchSizeプロパティが明示的に設定されていないか大きな値に設定されている場合は、Function sequence error例外がスローされる前に、アプリケーションによって多数の行がフェッチされている可能性があります。