spring 事務

(3)、<tx:annotation-driven />
 @Transactional 註解能夠被應用於接口定義和接口方法、類定義和類的 public 方法上。
 Spring團隊的建議是你在具體的類(或類的方法)上使用 @Transactional 註解,而不要使用在類所要實現的任何接口上。mysql

 

<!-- 開啓註解處理器 -->spring

     <context:annotation-config />sql

     

     <!-- 數據源 -->數據庫

     <bean id ="dataSource" class= "org.apache.commons.dbcp2.BasicDataSource" >apache

            <property name ="url" value= "jdbc:mysql://localhost:3306/osdemo?characterEncoding=utf-8" ></property >數組

            <property name ="password" value="abc123"></ property>sqlserver

            <property name ="driverClassName" value= "com.mysql.jdbc.Driver"></property >url

            <property name ="username" value="root"></ property>server

     </bean >接口

     

     <bean id ="transactionManager" class= "org.springframework.jdbc.datasource.DataSourceTransactionManager" >

            <property name ="dataSource" ref= "dataSource"></property >    

     </bean >

     

     <!-- 使用annotation定義事務 -->

     <tx:annotation-driven transaction-manager="transactionManager" proxy-target-class="true" />

 

能夠定義在方法上,也能夠定義在類上

 


詳細說明

@Transactional只能被應用到public方法上, 對於其它非public的方法,若是標記了@Transactional也不會報錯,但方法沒有事務功能.

Spring使用聲明式事務處理,默認狀況下,若是被註解的數據庫操做方法中發生了unchecked異常,全部的數據庫操做將rollback;若是發生的異常是checked異常,默認狀況下數據庫操做仍是會提交的。
這種默認的行爲是能夠改變的。

使用@Transactional註解的noRollbackFor和rollbackFor屬性

如:@Transactional(rollbackFor=Exception.class)可使checked異常發生時,數據庫操做也rollback、@Transactional(noRollbackFor=RuntimeException.class)可使unchecked異常發生時也提交數據庫操做。

也可使用noRollbackForClassName、rollbackForClassName屬性來指定一個異常類名的String數組來改變默認的行爲。

  讀取數據庫中的數據時是不須要事務管理的,這種狀況下可使用事務的傳播行爲來告訴Spring不須要開啓事務, 如:@Transactional(propagation = Propagation.NOT_SUPPORTED)。 事務的傳播行爲有: 1.           REQUIRED:表示業務方法須要在一個事務中處理,若是業務方法執行時已經在一個事務中,則加入該事務,不然從新開啓一個事務。這也是默認的事務傳播行爲; 2.           NOT_SUPPORTED:聲明業務方法不須要事務,若是業務方法執行時已經在一個事務中,則事務被掛起,等方法執行完畢後,事務恢復進行; 3.           REQUIRES_NEW:代表業務方法須要在一個單獨的事務中進行,若是業務方法進行時已經在一個事務中,則這個事務被掛起,並從新開啓一個事務來執行這個業務方法,業務方法執行完畢後,原來的事務恢復進行; 4.           MANDATORY:該屬性指定業務方法只能在一個已經存在的事務中進行,業務方法不能發起本身的事務;若是業務方法沒有在一個既有的事務中進行,容器將拋出異常; 5.           SUPPORTS:該屬性指定,若是業務方法在一個既有的事務中進行,則加入該事務;不然,業務方法將在一個沒有事務的環境下進行; 6.           NEVER:指定業務方法不能夠在事務中進行,若是業務方法執行時已經在一個事務中,容器將拋出異常; 7.           NESTED:該屬性指定,若是業務方法在一個既有的事務中執行,則該業務方法將在一個嵌套的事務中進行;不然,按照REQUEIRED來對待。它使用一個單獨的事務,這個事務能夠有多個rollback點,內部事務的rollback對外部事務沒有影響,但外部事務的rollback會致使內部事務的rollback。這個行爲只對DataSourceTransactionManager有效。   事務的隔離級別   使用@Transactional的Isolation屬性能夠指定事務的隔離級別。但事務的隔離級別是由底層的數據庫實現的,並非由Spring來實現。 1.       READ_UNCOMMITTED:會出現髒讀、不可重複讀和幻讀問題; 2.       READ_COMMITTED:會出現不可重複讀和幻讀問題; 3.       REPEATABLE_READ:會出現幻讀問題; 4.       SERIALIZABLE:串行化,不會出現上面的問題。   通常的數據庫默認提供的是READ_COMMITTED隔離級別,如sqlserver2000;Mysql默認提供的是REPEATABLE_READ。 @Transactional  的全部可選屬性以下: 屬性     類型     默認值     說明 propagation                               Propagation枚舉     REQUIRED     事務傳播屬性  isolation                                     isolation枚舉             DEFAULT     事務隔離級別 readOnly                                    boolean                      false     是否只讀 timeout                                       int                               -1     超時(秒) rollbackFor                                Class[]  {}                  須要回滾的異常類 rollbackForClassName           String[]  {}                  須要回滾的異常類名 noRollbackFor                          Class[]  {}                  不須要回滾的異常類 noRollbackForClassName     String[]  {}                  不須要回滾的異常類名 //事務傳播屬性     @Transactional(propagation=Propagation.REQUIRED) //若是有事務,那麼加入事務,沒有的話新建一個(不寫的狀況下)     @Transactional(propagation=Propagation.NOT_SUPPORTED) //容器不爲這個方法開啓事務     @Transactional(propagation=Propagation.REQUIRES_NEW) //無論是否存在事務,都建立一個新的事務,原來的掛起,新的執行完畢,繼續執行老的事務     @Transactional(propagation=Propagation.MANDATORY) //必須在一個已有的事務中執行,不然拋出異常     @Transactional(propagation=Propagation.NEVER) //必須在一個沒有的事務中執行,不然拋出異常(與Propagation.MANDATORY相反)     @Transactional(propagation=Propagation.SUPPORTS) //若是其餘bean調用這個方法,在其餘bean中聲明事務,那就用事務.若是其餘bean沒有聲明事務,那就不用事務.            @Transactional(propagation=Propagation.NESTED)      @Transactional (propagation = Propagation.REQUIRED,readOnly=true) //readOnly=true只讀,不能更新,刪除      @Transactional (propagation = Propagation.REQUIRED,timeout=30)//設置超時時間      @Transactional (propagation = Propagation.REQUIRED,isolation=Isolation.DEFAULT)//設置數據庫隔離級別 用 spring 事務管理器,由spring來負責數據庫的打開,提交,回滾. 默認遇到運行期例外(throw new RuntimeException("註釋");)會回滾,即遇到不受檢查(unchecked)的例外時回滾; 而遇到須要捕獲的例外(throw new Exception("註釋");)不會回滾,即遇到受檢查的例外(就是非運行時拋出的異常,編譯器會檢查到的異常叫受檢查例外或說受檢查異常)時,需咱們指定方式來讓事務回滾 ,以下: @Transactional(rollbackFor=Exception.class) //指定回滾,遇到異常Exception時回滾     public void methodName() {        throw new Exception("註釋");             } @Transactional(noRollbackFor=Exception.class)//指定不回滾,遇到運行期例外(throw new RuntimeException("註釋");)會回滾     public ItimDaoImpl getItemDaoImpl() {         throw new RuntimeException("註釋");     } 

相關文章
相關標籤/搜索