Spring的事務實現采用基于AOP的攔截器來實現,如果沒有在事務配置的時候注明回滾的checked exception,那么只有在發生了unchecked exception的時候,才會進行事務回滾。因此在DAO層和service層,最好拋出unckecked exception,畢竟對于數據庫操作,使用unckecked exception更加合適,這個方面的例子hibernate就是一個,在hibernate2中,HibernateException還是checked exceptions,但是到了hibernate3中就成了unchecked exceptions,因為對于數據庫操作來說,一旦出現異常,就是比較嚴重的錯誤,而且在client端基本上是無能為力的,所以使用unchecked exceptions更加合適。
另外,在DAO和service層的代碼中,除非是為了異常的轉化、重新拋出,否則不要捕捉和處理異常,否則AOP在攔截的時候就不能捕捉到異常,也就不能正確執行回滾。這一點通常很容易被忽視,只有在明白了spring的事務處理機制后,才能領會到。
對于hibernate的異常,spring會包裝hibernate的upckecked hibernateException到DAOAccessException,并且拋出,在事務管理層,一旦接收到DAOAccessException就會觸發事務的回滾,同時該異常會繼續向上層拋出,供上層進一步處理,比如在UI層向用戶反饋錯誤信息等。
在spring的事務管理環境下,使用unckecked exception可以極大地簡化異常的處理,只需要在事務層聲明可能拋出的異常(這里的異常可以是自定義的unckecked exception體系),在所有的中間層都只是需要簡單throws即可,不需要捕捉和處理,直接到最高層,比如UI層再進行異常的捕捉和處理。
posted on 2007-07-16 15:23
周銳 閱讀(1020)
評論(2) 編輯 收藏 所屬分類:
Spring