0

私のアプリケーション内には、ある程度の時間(30秒から5分)かかるプロセスがあり、その間にJPAを介してデータベースを操作します。

私の問題は、プロセスの状態をそのdbエンティティに設定したいということです。

 void runProcess(Process process) {
     process.setState("Started.");
     em.merge(process);

     ... db manipulations

     process.setState("First phase finished.");
     em.merge(process);

     ... db manipulations

     process.setState("Process finished.");
     em.merge(process);
 }

問題は、最初の更新のみが行われ、他の更新は無視されたままになることです。

エラーは発生せず、Hibernateログでプロセスの更新を3回確認できます。

 Hibernate: update process set state=? where id=?

ただし、最初の更新のみが行われます。

ありがとう。

4

1 に答える 1

1

エンティティに加えられた変更はメモリ内で行われ、フラッシュ時(通常はトランザクションの終了時)にのみデータベースに書き込まれます。

また、トランザクションの終了前にフラッフが行われた場合、または各プロセス状態の更新後にフラッシュした場合でも、トランザクションは互いに分離されており、デフォルトの分離であるため、他の同時トランザクションは新しい状態を認識できない可能性が高くなります。レベルは、ほとんどの場合、READ_COMMITTEDです(つまり、他のトランザクションは、コミットされた後にのみ変更を確認します)。

プロセス状態をデータベースに確実に書き込む場合は、この状態を別のトランザクションで書き込む必要があります。

于 2012-06-10T13:58:21.177 に答える