Spring的聲明式事務簡介

來源:互聯網
上載者:User

聲明式交易管理:

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配置支援的通知類型 (例如ThrowAdvice, AfterReturningtAdvice或BeforeAdvice, 這些都是預設支援的)。這些通知必須支援執行個體共用模式。如果你需要進階AOP特 性來使用事務,如有狀態的maxin,那最好使用通用的 org.springframework.aop.framework.ProxyFactoryBean, 而不是TransactionProxyFactoryBean實用代理建立者。

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

附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

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.