1 <tx:advice id="txAdvice" transaction-manager="transactionManager"> 2 <tx:attributes> 3 <tx:method name="get*" propagation="SUPPORTS" isolation="DEFAULT" 4 read-only="true" /> 5 <tx:method name="find*" propagation="SUPPORTS" isolation="DEFAULT" 6 read-only="true" /> 7 <tx:method name="load*" propagation="SUPPORTS" isolation="DEFAULT" 8 read-only="true" /> 9 <tx:method name="*" propagation="REQUIRED" rollback-for="java.lang.Exception" /> 10 </tx:attributes> 11 </tx:advice>
<tx:method >的屬性詳解java
屬性
|
類型
|
默認值
|
說明
|
propagation | Propagation枚舉 | REQUIRED | 事務傳播屬性 |
isolation | isolation枚舉 | DEFAULT(所用數據庫默認級別) | 事務隔離級別 |
readOnly | boolean | false | 是否才用優化的只讀事務 |
timeout | int | -1 | 超時(秒) |
rollbackFor | Class[] | {} | 須要回滾的異常類 |
rollbackForClassName | String[] | {} | 須要回滾的異常類名 |
noRollbackFor | Class[] | {} | 不須要回滾的異常類 |
noRollbackForClassName | String[] | {} | 不須要回滾的異常類名 |
readOnly
事務屬性中的readOnly標誌表示對應的事務應該被最優化爲只讀事務。若是值爲true就會告訴Spring我這個方法裏面沒有insert或者update,你只須要提供只讀的數據庫Connection就好了,這種執行效率會比read-write的Connection高,因此這是一個最優化提示。在一些狀況下,一些事務策略可以起到顯著的最優化效果,例如在使用Object/Relational映射工具(如:Hibernate或TopLink)時避免dirty checking(試圖「刷新」)。
timeout
在屬性中還有定義「timeout」值的選項,指定事務超時爲幾秒。通常不會使用這個屬性。在JTA中,這將被簡單地傳遞到J2EE服務器的事務協調程序,並據此獲得相應的解釋。
Isolation Level(事務隔離等級)的5個枚舉值
爲何事務要有Isolation Level這個屬性?先回顧下數據庫事務的知識:
第一類丟失更新(lost update):在徹底未隔離事務的狀況下,兩個事物更新同一條數據資源,某一事物異常終止,回滾形成第一個完成的更新也同時丟失。
第二類丟失更新(second lost updates):是不可重複讀的特殊狀況,若是兩個事務都讀取同一行,而後兩個都進行寫操做,並提交,第一個事務所作的改變就會丟失。
髒讀(dirty read):若是第二個事務查詢到第一個事務還未提交的更新數據,造成髒讀。由於第一個事務你還不知道是否提交,因此數據不必定是正確的。
虛讀(phantom read):一個事務執行兩次查詢,第二次結果集包含第一次中沒有或者某些行已被刪除,形成兩次結果不一致,只是另外一個事務在這兩次查詢中間插入或者刪除了數據形成的。
不可重複讀(unrepeated read):一個事務兩次讀取同一行數據,結果獲得不一樣狀態結果,如中間正好另外一個事務更新了該數據,兩次結果相異,不可信任。
當遇到以上這些狀況時咱們能夠設置isolation下面這些枚舉值:
DEFAULT:採用數據庫默認隔離級別
SERIALIZABLE:最嚴格的級別,事務串行執行,資源消耗最大;
REPEATABLE_READ:保證了一個事務不會修改已經由另外一個事務讀取但未提交(回滾)的數據。避免了「髒讀取」和「不可重複讀取」的狀況,可是帶來了更多的性能損失。
READ_COMMITTED:大多數主流數據庫的默認事務等級,保證了一個事務不會讀到另外一個並行事務已修改但未提交的數據,避免了「髒讀取」。該級別適用於大多數系統。
READ_UNCOMMITTED:保證了讀取過程當中不會讀取到非法數據。隔離級別在於處理多事務的併發問題。
關於propagation屬性的7個傳播行爲
REQUIRED:指定當前方法必需在事務環境中運行,若是當前有事務環境就加入當前正在執行的事務環境,若是當前沒有事務,就新建一個事務。這是默認值。
SUPPORTS:指定當前方法加入當前事務環境,若是當前沒有事務,就以非事務方式執行。
MANDATORY:指定當前方法必須加入當前事務環境,若是當前沒有事務,就拋出異常。
REQUIRES_NEW:指定當前方法老是會爲本身發起一個新的事務,若是發現當前方法已運行在一個事務中,則原有事務被掛起,我本身建立一個屬於本身的事務,直我本身這個方法commit結束,原先的事務纔會恢復執行。
NOT_SUPPORTED:指定當前方法以非事務方式執行操做,若是當前存在事務,就把當前事務掛起,等我以非事務的狀態運行完,再繼續原來的事務。
NEVER:指定當前方法絕對不能在事務範圍內執行,若是方法在某個事務範圍內執行,容器就拋異常,只有沒關聯到事務,才正常執行。
NESTED:指定當前方法執行時,若是已經有一個事務存在,則運行在這個嵌套的事務中.若是當前環境沒有運行的事務,就新建一個事務,並與父事務相互獨立,這個事務擁有多個能夠回滾的保證點。就是指我本身內部事務回滾不會對外部事務形成影響,只對DataSourceTransactionManager事務管理器起效。數據庫