<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    Denis's Java Library

    The only documentation is the code itself

    spring聲明式事務管理祥述

    Spring也提供了聲明式事務管理。這是通過Spring AOP實現的。

    Spring 中進行事務管理的通常方式是利用AOP(面向切片編程)的方式,為普通java類封裝事務控制,它是通過動態代理實現的,由于接口是延遲實例化的, spring在這段時間內通過攔截器,加載事務切片。原理就是這樣,具體細節請參考jdk中有關動態代理的文檔。本文主要講解如何在spring中進行事 務控制。
    動態代理的一個重要特征是,它是針對接口的,所以我們的dao要通過動態代理來讓spring接管事務,就必須在dao前面抽象出一個接口,當然如果沒有這樣的接口,那么spring會使用CGLIB來解決問題,但這不是spring推薦的方式,所以不做討論.

    大多數Spring用戶選擇聲明式事務管理。這是最少影響應用代碼的選擇, 因而這是和非侵入性的輕量級容器的觀念是一致的。

    從考慮EJB CMT和Spring聲明式事務管理的相似以及不同之處出發是很有益的。 它們的基本方法是相似的:都可以指定事務管理到單獨的方法;如果需要可以在事務上 下文調用setRollbackOnly()方法。不同之處如下:

    • 不象EJB CMT綁定在JTA上,Spring聲明式事務管理可以在任何環境下使用。 只需更改配置文件,它就可以和JDBC、JDO、Hibernate或其他的事務機制一起工作

    • Spring可以使聲明式事務管理應用到普通Java對象,不僅僅是特殊的類,如EJB

    • Spring提供聲明式回滾規則:EJB沒有對應的特性, 我們將在下面討論這個特性。回滾可以聲明式控制,不僅僅是編程式的

    • Spring允許你通過AOP定制事務行為。例如,如果需要,你可以在事務 回滾中插入定制的行為。你也可以增加任意的通知,就象事務通知一樣。使用 EJB CMT,除了使用setRollbackOnly(),你沒有辦法能 夠影響容器的事務管理

    • Spring不提供高端應用服務器提供的跨越遠程調用的事務上下文傳播。如 果你需要這些特性,我們推薦你使用EJB。然而,不要輕易使用這些特性。通常我 們并不希望事務跨越遠程調用

    回滾規則的概念是很重要的:它們使得我們可以指定哪些異常應該發起自 動回滾。我們在配置文件中,而不是Java代碼中,以聲明的方式指定。因此,雖然我們仍 然可以編程調用TransactionStatus對象的 setRollbackOnly()方法來回滾當前事務,多數時候我們可以 指定規則,如MyApplicationException應該導致回滾。 這有顯著的優點,業務對象不需要依賴事務基礎設施。例如,它們通常不需要引 入任何Spring API,事務或其他任何東西。

    EJB的默認行為是遇到系統異常(通常是運行時異常), EJB容器自動回滾事務。EJB CMT遇到應用程序異常 (除了java.rmi.RemoteException外的checked異常)時不 會自動回滾事務。雖然Spring聲明式事務管理沿用EJB的約定(遇到unchecked 異常自動回滾事務),但是這是可以定制的。

    按照我們的測試,Spring聲明式事務管理的性能要勝過EJB CMT。

    通 常通過TransactionProxyFactoryBean設置Spring事務代理。我們需 要一個目標對象包裝在事務代理中。這個目標對象一般是一個普通Java對象的bean。當我 們定義TransactionProxyFactoryBean時,必須提供一個相關的 PlatformTransactionManager的引用和事務屬性事務屬性含有上面描述的事務定義。

    <bean id="petStore" 
    class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
    <property name="transactionManager"><ref bean="transactionManager"/></property>
    <property name="target"><ref bean="petStoreTarget"/></property>
    <property name="transactionAttributes">
    <props>
    <prop key="insert*">PROPAGATION_REQUIRED,-MyCheckedException</prop>
    <prop key="update*">PROPAGATION_REQUIRED</prop>
    <prop key="*">PROPAGATION_REQUIRED,readOnly</prop>
    </props>
    </property>
    </bean>

    事 務代理會實現目標對象的接口:這里是id為petStoreTarget的bean。(使用 CGLIB也可以實現具體類的代理。只要設置proxyTargetClass屬性為true就可以。 如果目標對象沒有實現任何接口,這將自動設置該屬性為true。通常,我們希望面向接口而不是 類編程。)使用proxyInterfaces屬性來限定事務代理來代 理指定接口也是可以的(一般來說是個好想法)。也可以通過從 org.springframework.aop.framework.ProxyConfig繼承或所有AOP代理工廠共享 的屬性來定制TransactionProxyFactoryBean的行為。

    這里的transactionAttributes屬性定義在 org.springframework.transaction.interceptor.NameMatchTransactionAttributeSource 中的屬性格式來設置。這個包括通配符的方法名稱映射是很直觀的。注意 insert*的映射的值包括回滾規則。添加的-MyCheckedException 指定如果方法拋出MyCheckedException或它的子類,事務將 會自動回滾。可以用逗號分隔定義多個回滾規則。-前綴強制回滾,+前綴指定提交(這允許即使拋出unchecked異常時也可以提交事務,當然你自己要明白自己 在做什么)。

    TransactionProxyFactoryBean允許你通過 “preInterceptors”和“postInterceptors”屬性設置“前”或“后”通知來提供額外的 攔截行為。可以設置任意數量的“前”和“后”通知,它們的類型可以是 Advisor(可以包含一個切入點), MethodInterceptor或被當前Spring配置支持的通知類型 (例如ThrowAdviceAfterReturningtAdviceBeforeAdvice, 這些都是默認支持的)。這些通知必須支持實例共享模式。如果你需要高級AOP特 性來使用事務,如有狀態的maxin,那最好使用通用的 org.springframework.aop.framework.ProxyFactoryBean, 而不是TransactionProxyFactoryBean實用代理創建者。

    也可以設置自動代理:配置AOP框架,不需要單獨的代理定義類就可以生成類的 代理。

    附兩個spring的事務配置例子:
    <prop key="add">
         PROPAGATION_REQUIRES_NEW, -MyException
    </prop>
    注:上面的意思是add方法將獨占一個事務,當事務處理過程中產生MyException異常或者該異常的子類將回滾該事務。

    <prop key="loadAll">
        PROPAGATION_SUPPORTS, ISOLATION_READ_COMMITED, Readonly
    </prop>
    注:表示loadAll方法支持事務,而且不會讀取沒有提交事務的數據。它的數據為只讀(這樣有助于提高讀取的性能)

    附A Spring中的所有事務策略

    PROPAGATION_MANDATORY
    PROPAGATION_NESTED
    PROPAGATION_NEVER
    PROPAGATION_NOT_SUPPORTED
    PROPAGATION_REQUIRED
    PROPAGATION_REQUIRED_NEW
    PROPAGATION_SUPPORTS

    附B Spring中所有的隔離策略:

    ISOLATION_DEFAULT
    ISOLATION_READ_UNCOMMITED
    ISOLATION_COMMITED
    ISOLATION_REPEATABLE_READ
    ISOLATION_SERIALIZABLE

    posted on 2005-12-01 11:47 DenisLing 閱讀(15358) 評論(0)  編輯  收藏


    只有注冊用戶登錄后才能發表評論。


    網站導航:
     
    主站蜘蛛池模板: 黄色片在线免费观看| 免费无码中文字幕A级毛片| 一个人看www在线高清免费看| 亚洲精品无码国产| a毛片在线免费观看| 亚洲一级二级三级不卡| 一区二区三区四区免费视频| 久久丫精品国产亚洲av| 国产2021精品视频免费播放| 亚洲乱码一区av春药高潮| 免费看美女裸露无档网站| 亚洲性色精品一区二区在线| 日韩一区二区在线免费观看 | 三根一起会坏掉的好痛免费三级全黄的视频在线观看 | 亚洲av日韩综合一区二区三区| 女人与禽交视频免费看| 亚洲AV无码一区二区三区鸳鸯影院| 天堂亚洲免费视频| 中文在线免费视频| 亚洲精品自在线拍| 99视频在线精品免费观看6| 亚洲Av无码国产一区二区| 亚洲国产精品嫩草影院久久| 国产成年无码久久久免费| 亚洲性69影院在线观看| 国产成人高清精品免费软件| 成人妇女免费播放久久久| 亚洲网站视频在线观看| 狠狠久久永久免费观看| 99久久免费国产精品热| 亚洲午夜精品国产电影在线观看| 热99re久久精品精品免费| a级片免费观看视频| 国产成人精品日本亚洲专区6| 免费一级毛片在线观看| 午夜免费福利片观看| 婷婷国产偷v国产偷v亚洲| 一区二区三区亚洲| 国产免费小视频在线观看 | 99re6免费视频| 久久久久亚洲国产AV麻豆 |