2015-03-03 204 views
1

如果我想在成功執行數據庫操作之後使用commit(session),那麼最好將它放在try還是finally塊中? 這裏我最後用了它,應該試試嗎?我們應該在哪裏使用commit(session),在try還是finally中?

public void delete(---) { 
    Session session = init(); 
    try { 
     ---- 
    } catch (HibernateException e) { 
     rollback(session); 
     logger.error("delete failed", e); 
     throw e; 
    } finally { 
     commit(session); 
     close(session); 
    } 
} 

回答

5

應該在try,原因有二:

  • commit會話如果一些異常或錯誤等HibernateException,你幾乎肯定不希望這樣做
  • 撥打rollback後,您會致電commit。我不記得Hibernate是否允許你這樣做(通過默默地忽略回滾),但至少它是醜陋的。每個會話應該或者承諾回滾。

這裏正常的解決辦法是保持被設定,當你成功提交單獨boolean變量,然後檢查finally,如果必要的話回滾:

boolean committed = false; 
try { 
    // Do stuff 
    commit(session); 
    committed = true; 
} catch (HibernateException e) { 
    logger.error("delete failed", e); 
    throw e; 
} finally { 
    if (!committed) { 
     rollback(session); 
    } 
    // TODO: This won't execute if rollback fails. 
    // Check whether that's a problem. 
    close(session); 
} 
+0

感謝您的詳細答案喬恩。 – 2015-03-03 09:15:23

0

應該在tryfinally也將在catch之後調用。

0

它應該明確地放在try塊中。 finally塊通常只用於關閉任何連接。

+0

那麼,在這種情況下,如果會話還沒有提交,那麼finally塊也應該用於回滾。否則,任何未處理的異常將最終泄露這些會話。 – 2015-03-03 08:20:38

0

你需要把它放在嘗試塊,否則你不會認識到任何錯誤,你不能回滾

相關問題