サイベックス:
それは@Transactionalメソッドの途中で()Hibernateのフラッシュを呼び出すと、データベースに不完全な結果を保存することは可能ですか?たとえば、この機能は、データベースへの「ジョン」を救う可能性がありますか?
@Transactional
public void tt() {
Student s = new Student("John");
em.persist(s);
em.flush();
// Perform some calculations that change some attributes of the instance
s.setName("Jeff");
}
私は、インメモリ・データベースH2でそれを試してみましたが、それが不完全なトランザクションの変更を保存しませんでした。しかし、それは一定の条件の下で、多分他のDBエンジンで可能ですか?
ピルヨ:
あなたが呼び出す前に、それは何も保存すべきではないem.commit()
か、トランザクションが終了します。私が見つけた最良の説明からであるここに欠か抜粋を.Below:
この操作は、DML文(挿入/更新/削除など)データベースに実行されるが、現在のトランザクションがコミットされることはありませんが発生します。ことを意味するフラッシュ()は、他のEntityManagerインスタンスまたは他の外部データベースクライアントから見える現在の変更をすることはありません。それが唯一のトランザクションコミット時に起こります。つまりフラッシュ()操作でのみデータベース・セッションへのEntityManagerから現在のメモリキャッシュをフラッシュします。
だから、フラッシュは、いくつかのJPAの例外を発生させるかもしれないが、それは実際に取引が終了する前にデータベースにコミットされません。