Spring學習筆記---7-Spring事務管理(3)

一、註解配置聲明式事務
 
      除了基於XML的事務配置之外,Spring還提供了基於註解的事務配置,即通過@Transaction對需要事務增強的Bean接口實現類或方法進行標註,在容器中配置基於註解的事務增強驅動,即可啓用基於註解的聲明式事務。

使用@Transaction 註解

        順着上面講的,使用@Transaction對基於  aop /tx 命名空間的事務配置進行改造,比較兩者的差異:
               
       因爲註解本身具有一組普適性的默認事務屬性,所以往往只要爲需要事務處理的業務類添加一個@Transaction註解就完成了業務類事務屬性的配置。
       當然,註解只是提供元數據,它本身並不能完成事務切面織入的功能。因此,還需要在Spring配件文件通過Spring 容器對標註@Transaction的Bean進行加工處理,如代碼:
        
       默認情況下,<tx:annotation-driven>會自動使用名稱爲“transactionManager”的事務管理器,所以如果用戶的事務管理器id爲“transactionManager”,可以進一步將 ①  處的配置簡化爲<tx:annotation-driven/>。
 
       <tx:annotation-driven> 還有另外兩個屬性: 
          1、proxy-target-class:可選項,默認值爲false,如果爲true,Spring 將通過創建子類來代理業務類,如果爲false,則使用基於接口的代理。如果使用子類代理,則需要在類路徑中添加CGLib.jar 類庫。
          2、order:如果業務類除事務切面外,還需要織入其他的切面,則通過該屬性可以控制事務切面在目標連接點的織入順序。默認值:proxy。
        

關於@Transaction 的屬性
      基於@Transaction註解的配置和基於XML的配置方式一樣,也擁有一組普適性很強的默認事務屬性,用戶往往直接使用這些默認的屬性就可以了。
  • 事務傳播行爲:PROPAGATION_REQUIRED;
  • 事務隔離級別:ISOLATION_DEFAULT;
  • 讀寫事務屬性:讀/寫事務。
  •  超時時間:依賴於底層的事務系統的默認值。
  • 回滾設置:任何運行期異常引發回滾,任何檢查性異常不會引發回滾。
      因爲這些默認設置在大多數情況下都是適用的,一般不需要手工設置事務註解的屬性,見下圖,當然,Spring允許通過手工設置屬性值覆蓋默認值。
      
       
       @Transaction 註解可以被應用與接口定義和接口方法、類定義和類的public 方法上。但Spring 建議在業務實現類上使用@Transaction 註解,當然也可以在業務接口上使用@Transaction 註解。 但這樣會留下一些容易被忽視的隱患。因爲註解不能被繼承,所以業務接口中標註的@Transaction 註解不會被實現業務類繼承,如果通過以下的配置啓用子類代理:
     <!-- 啓用事務註解 -->
      <tx:annotation-driven transaction-manager="transactionManager" proxy-target-class="true"/>
業務類不會添加事務增強,照樣工作在非事務的環境下。例如,如果使用子類代理,假設用戶爲IViewSpace接口標註了@Transaction 註解,其實現類ViewSpaceImpl 依舊不會啓用事務機制。
       因此,Spring建議在具體業務類上使用@Transaction 註解。這樣,不管<tx:annotation-driven> 將 proxy-target-class 屬性值配置爲true 還是false ,業務類都會啓用事務機制。

在方法處使用註解:
          
      方法處的註解會覆蓋類定義處的註解,如:
      

使用不同的事務管理器
 
       在不同的方法上使用不同的事務管理器,可以在xml文件中配置這些個不同的事務管理器。
        如:
           
                 
        XML文件中配置的事務管理器,如圖:
            


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章