2012-11-07 19 views
3

如果我有像下面這樣的事務處理方法,那麼在事務提交和回滾的情況下,何時執行finally塊?例如,如果「用hibernate持久化數據庫中的某個實體」會引發一些真實的hibernate異常?如何用finally塊在事務性上下文中處理異常?

1)事務回滾 2)最後塊執行

1)最後被執行塊 2)事務回滾

public void someTransactionalPersist(...) { 
    try { 
    // persist some entity in database with hibernate 
    } finally { 
     // do something 
    } 
} 

回答

0

在這兩種情況下,最後塊將執行finally 。 順序會,如果你的嘗試塊拋出異常,那麼它會先rollback然後finally塊將executed

+0

我懷疑過回滾第一則finally塊,因爲交易將通過將圍繞方法someTransactionalPersist所以離開這個方法方面的執行將嘗試回滾之後方面進行管理,則可以解釋,爲什麼先回滾? –

+0

回滾將在發生任何錯誤時調用。最後,塊將始終運行,並且嘗試塊的最後一行。 – subodh

+0

是的同意,但回滾將由方面完成,所以它會在執行方法 –

0

假設someTransactionalPersist方法是事務的起始點,那麼如果在try塊中有任何異常,那麼將首先執行,並且如果從finally塊中拋出運行時異常,那麼spring將作爲默認配置進行回滾。

如果你想回滾的特殊例外,那麼你必須配置@TransactionalrollbackFor

,如果你想手動標記事務爲回滾,不需要進一步引發異常/運行時異常,那麼你必須爲此在catch塊TransactionAspectSupport.currentTransactionStatus().setRollbackOnly()

0

關於規範http://docs.oracle.com/javase/specs/jls/se7/html/jls-14.html#jls-14.20.2

如果沒有異常,後嘗試執行沒有錯誤,finally塊將被執行。如果嘗試中有錯誤並且存在catch-block,則捕獲該異常,catch塊將被執行。之後,finally塊將被執行。

如果try塊中存在錯誤,並且沒有catch塊,捕獲該異常,finally塊將被執行,並且您的方法將拋出未捕獲的異常。

所以,finally塊將會執行總是並且將永遠是最後一塊,正在執行。

1
try{ 
    //This is executed if an exception is not thrown 
} catch(Exception e){ 
    //This is executed if an exception is thrown 
} finally{ 
    //This is executed regardless of which of the above was executed 
} 
+0

咋,我知道,但我問的是如何認爲發生在事務性上下文中,方法完成後拋出異常,在方法結束時提交/回滾處於關閉狀態,並且如果有注入異常與AOP。 – user358448