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

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

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

    隨筆-9  評論-168  文章-266  trackbacks-0

    Spring也提供了聲明式事務(wù)管理。這是通過Spring AOP實(shí)現(xiàn)的。

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

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

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

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

    • Spring 的聲明式事務(wù)管理可以應(yīng)用到普通Java對象,不僅僅是特殊的類,如EJB

    • Spring提供聲明式回滾規(guī)則:EJB沒有對應(yīng)的特性, 我們將在下面討論這個(gè)特性?;貪L可以聲明式控制,不僅僅是編程式的

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

    • Spring不提供高端應(yīng)用服務(wù)器提供的跨越遠(yuǎn)程調(diào)用的事務(wù)上下文傳播。如果你需要這些特性,我們推薦你使用EJB。然而,不要輕易使用這些特性。通常我們并不希望事務(wù)跨越遠(yuǎn)程調(diào)用

    回滾規(guī)則的概念是很重要的:它們使得我們可以指定哪些異常應(yīng)該發(fā)起自動回滾。我們在配置文件中,而不是Java代碼中,以聲明的方式指定。因此,雖然我們?nèi)匀豢梢跃幊陶{(diào)用TransactionStatus對象的 setRollbackOnly()方法來回滾當(dāng)前事務(wù),多數(shù)時(shí)候我們可以指定規(guī)則,如MyApplicationException應(yīng)該導(dǎo)致回滾。 這有顯著的優(yōu)點(diǎn),業(yè)務(wù)對象不需要依賴事務(wù)基礎(chǔ)設(shè)施。例如,它們通常不需要引入任何Spring API,事務(wù)或其他任何東西。

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

    按照我們的測試,Spring聲明式事務(wù)管理的性能要?jiǎng)龠^EJB CMT。

    通常通過TransactionProxyFactoryBean設(shè)置Spring事務(wù)代理。我們需要一個(gè)目標(biāo)對象包裝在事務(wù)代理中。這個(gè)目標(biāo)對象一般是一個(gè)普通Java對象的bean。當(dāng)我們定義TransactionProxyFactoryBean時(shí),必須提供一個(gè)相關(guān)的 PlatformTransactionManager的引用和事務(wù)屬性事務(wù)屬性含有上面描述的事務(wù)定義。

    <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>

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

    這里的transactionAttributes屬性定義在 org.springframework.transaction.interceptor.NameMatchTransactionAttributeSource 中的屬性格式來設(shè)置。這個(gè)包括通配符的方法名稱映射是很直觀的。注意 insert*的映射的值包括回滾規(guī)則。添加的-MyCheckedException 指定如果方法拋出MyCheckedException或它的子類,事務(wù)將 會自動回滾??梢杂枚禾柗指舳x多個(gè)回滾規(guī)則。-前綴強(qiáng)制回滾,+前綴指定提交(這允許即使拋出unchecked異常時(shí)也可以提交事務(wù),當(dāng)然你自己要明白自己 在做什么)。

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

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

    附兩個(gè)spring的事務(wù)配置例子:
    <prop key="add">
         PROPAGATION_REQUIRES_NEW, -MyException
    </prop>
    注:上面的意思是add方法將獨(dú)占一個(gè)事務(wù),當(dāng)事務(wù)處理過程中產(chǎn)生MyException異?;蛘咴摦惓5淖宇悓⒒貪L該事務(wù)。

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

    附A Spring中的所有事務(wù)策略

    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


                                               ----------------------http://www.tkk7.com/DenisLing/archive/2005/12/01/22096.html
    posted on 2007-11-24 17:36 紫蝶∏飛揚(yáng)↗ 閱讀(552) 評論(0)  編輯  收藏 所屬分類: Spring
    主站蜘蛛池模板: 四虎永久在线精品免费观看地址 | 亚洲第一成年免费网站| 91亚洲精品自在在线观看| 亚洲免费视频在线观看| 亚洲国产精品热久久| 久久亚洲精品国产精品黑人| 亚洲va中文字幕无码久久| 亚洲AV一宅男色影视| 久久久久久久尹人综合网亚洲 | 久久精品a一国产成人免费网站| 国产1000部成人免费视频| av无码久久久久不卡免费网站| 我的小后妈韩剧在线看免费高清版| 1000部拍拍拍18勿入免费凤凰福利| 1000部拍拍拍18勿入免费视频下载 | 国产成A人亚洲精V品无码| 亚洲成熟xxxxx电影| 91亚洲精品第一综合不卡播放| 亚洲成人黄色网址| 久久久久亚洲国产| 日韩色视频一区二区三区亚洲| 免费在线人人电影网| 99视频在线免费观看| 中文字幕视频免费| 国产香蕉九九久久精品免费| 蜜桃精品免费久久久久影院| 免费成人午夜视频| 亚洲国产精品无码成人片久久| 亚洲视频在线观看免费视频| 自拍偷区亚洲国内自拍| 美女视频黄频a免费大全视频| 抽搐一进一出gif免费视频| 国产精品免费看久久久| 成年性生交大片免费看| 亚洲国产成人久久精品99| 亚洲Av永久无码精品三区在线| 91嫩草亚洲精品| 美女被羞羞网站免费下载| 18禁超污无遮挡无码免费网站 | 99久久国产免费中文无字幕| 国产精品美女午夜爽爽爽免费|