2007-03-24

[Note] Hibernate Flush

Hibernate預設的flush時機:
  • tx commit時
  • 查詢前
  • 明確呼叫session.flush()
在tx commit時flush為Hibernate的特色,JDBC在commit時並不會flush。

可以用session.setFlushMode()設定flush執行時機:
  • FlushMode.AUTO:預設值,執行時機為tx commit時、查詢前與明確呼叫session.flush()
  • FlushMode.COMMIT:執行時機為tx commit時與明確呼叫session.flush(),少了查詢前這一項,會出現查詢到『stale data』的情況,因為在執行查詢時,session的cache可能已經有些被修改但未flush到db的資料,這些異動資料是查詢不到的。
  • FlushMode.MANUAL:執行時機只有明確呼叫session.flush()
頻繁的flush會影響效能,另外使用預設flush時,modify-query-modify-query的使用方式也是效能殺手。

flush之後,可以從db查詢的到,表示已經進db了,但是若在flush之後發生錯誤導致rollback,那些已經被flush進db的能否rollback呢?經過測試,flush進db的資料是可以被rollback的

沒有留言:

張貼留言