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