私はアプリを継承しました。このアプリは、トリガーベースの挿入と更新を行い、StaleObjectExceptionをスローすることがあります。多くのデバッグ(tx、hibernate、typeなど)を追加しようとしたため、さらに混乱しました。
15:21:00 Calling dao.insert
15:21:00 starting Trancation T1
15:21:01 insert records including object #290595
15:21:01 Transaction T1 commits
ログ、休止状態の挿入、およびデータにtx commitが表示され、実際、ID#290595のオブジェクトが値としてバインドされています。15:24:00にも同様の挿入がありますが、15:25:00まで、アプリは完全にサイレントです(ユーザーなし、その他のアクティビティなし)。
15:25:00 Start a Required_new transaction T2
15:25:00 Calling dao.finder
15:25:01 dao transaction uses propagated T2
15:25:01 Select returns object with id #290595
15:25:01 ends propagated transacted finder
15:25:02 calling dao.update
15:25:02 dao transaction uses propagated T2
15:25:02 binds object with id #290595
15:25:02 Could Not Synchronize Database State With Session (StaleObjectStateException)
データベースのSQLクエリは、レコード#290595が実際には存在しないことを示しています。挿入から失敗まで4分あります。言うまでもなく、それは通常、ほとんどの日で機能しますが、突然....
トランザクションコミット時に休止状態が自動的にフラッシュしてコミットしませんか?
挿入によってデータがキャッシュに移動されたが、DBには移動されなかったと仮定します。これはキャッシュに再び見つかりましたが、DBにないため、更新を拒否します。だから問題は本当に誰かが素晴らしいアイデアを持っているかどうかです?
これはOracleDBであり、T2にRequired_newトランザクションがあり、isolation_levelがシリアル化されていることを確認しようとしましたが、ほとんど効果がありません。挿入が何らかの形でコミットされていないままになっていると思い始めています。
どんな提案も歓迎します