何らかの理由で、Oracle JDBC ドライバーが呼び出されたときに、ResultSet
カーソルを別の場所 (同じ行ではなく、次の行ではなく) に移動する場合があります (行のupdateRow
挿入と削除も行っています)。この問題を回避するにはどうすればよいですか?
注: 結果は、テーブルの主キーによって並べ替えられます (これは SQL で指定しました)。しかし、「order by」句が適切に機能していないのではないかとますます疑っています。
この問題は、ユーザー エラーが原因でした。別のマシンでアプリケーションの別のコピーを実行していましたが、それは忘れていましたが、同時にデータベースを変更していました。
前方のみ更新可能な結果セットは、一方向 (前方) にのみ移動し、行も更新できるカーソルを維持します。これは、同時実行モードResultSet.CONCUR_UPDATABLE
とタイプで作成する必要がありますResultSet.TYPE_FORWARD_ONLY
。
注: デフォルトのタイプはResultSet.TYPE_FORWARD_ONLY
.
変更の可視性
前方のみの結果セットで更新または削除が行われた後、結果セットのカーソルは、更新または削除されたばかりの行ではなく、結果セットの次の行の直前にあります (次の行に移動する必要があります)。それ以上の行操作が許可される前の次の行)。これは、 および による変更が表示されないことを意味しResultSet.updateRow()
ますResultSet.deleteRow()
。行が挿入されている場合、つまり、ResultSet.insertRow()
それを使用すると、前方のみの結果セットで表示される場合があります。
競合する操作 結果セットの現在の行は、更新ロックでロックされるため、他のトランザクションによって変更できません。コミット後に開いたままになっている結果セットは、操作を許可する前に次の行に移動する必要があります。
一部の競合により、結果セットが更新/削除を実行できなくなる場合があります。現在の行が同じトランザクション内のステートメントによって削除された場合ResultSet.updateRow()
、カーソルが有効な行に配置されなくなるため、への呼び出しによって例外が発生します。
ドキュメントのどこにも、updateRow
操作後にカーソルが次の行に移動するとは書かれていません...
ソース: