0

2つのアプリケーションがあります。最初のアプリケーションはwhileループでデータベースに保持され、ループは長い時間(たとえば、10〜15分)後に終了します。ただし、2番目のアプリケーションには、最初のアプリケーションがデータベースに既に保持されているデータが必要です。2番目のアプリケーションは、最初のアプリケーションの終了を待つことができません。最初のアプリケーションの実行が開始された直後に開始されます。 最初のアプリケーションがデータをデータベースとすぐに同期することを期待して、最初のアプリケーションでEntityManager.flush()を使用しました。別のトランザクションにある2番目のアプリケーションがデータの処理を開始できるようにします。

これは機能していません。flush()メソッドの目的は何ですか?問題を解決するにはどうすればよいですか?助けてください !!

4

2 に答える 2

6

flush()保留中のすべての変更をデータベースに書き込みます。挿入、更新、削除のステートメントを実行します。(デフォルトでは)トランザクションをコミットする前に自動的に呼び出されます。

ただし、フラッシュしたからといって、他のトランザクションに変更が表示されるわけではありません。これは、トランザクション分離レベルに依存します。ほとんどのデータベースでは、これはREAD_COMMITTEDです。トランザクションは互いに分離して実行されます(ACIDのI )。したがって、分離レベルがREAD_COMMITTEDの場合、2番目のアプリのトランザクションは、このトランザクションがコミットされるまで、最初のアプリのトランザクションで行われた変更を認識しません。

于 2012-06-27T09:29:51.057 に答える
2

最初のアプリケーションの作業を別々のトランザクションに分割する必要があるように聞こえます。変更は通常、コミット後に他のトランザクションにのみ表示されます(JB Nizetによって説明されています。変更できますが、変更しないでください)。

于 2012-06-27T09:39:59.923 に答える