轉貼地址:http://spring.jactiongroup.net/viewtopic.php?p=5305&sid=db136be488b88cb911bf4903611c2ac7
JTA UserTransaction與JTA TransactionManager
讓我們來看一些Spring的JTA支持的詳細情況。雖然理解該機制是很有幫助的,但是通常不必為之擔心。對于像前面的小節所展示的簡單用例,只需要一個標準的JtaTransactionManager定義,以及由J2EE服務器提供的支持XA規范的DataSource。
默認的Spring JtaTransactionManager設置將從標準的JNDI位置獲取JTA的 javax.transaction.UserTransaction對象,該JNDI位置由J2EE指定:java: comp/UserTransaction。對于大多數標準J2EE環境下的用例來說,它工作良好。
但是,默認的JtaTransactionManager不能執行事務掛起操作(即它不支持PROPAGATION_REQUIRES_NEW 和PROPAGATION_NOT_SUPPORTED)。原因是標準的JTA UserTransaction接口不支持掛起或恢復事務的操作;它只支持開始和完成新事務的操作。
為執行事務掛起操作,還需要提供javax.transaction.TransactionManager實例,按照JTA的規定,它提供標準的掛起和恢復方法。遺憾的是,J2EE沒有為JTA TransactionManager定義標準的JNDI位置!因此,必須使用特定于供應商的(vendor-specific)查尋機制。
代碼:
<bean id="transactionManager"
?? class="org.springframework.transaction.jta.JtaTransactionManager">
???? <property name="transactionManagerName">
??????? <value>vendorSpecificJndiLocation</value>
???? </property>
</bean>
?
實質上,J2EE沒有考慮把JTA TransactionManager接口作為它的公開API的一部分。JTA規范規定的TransactionManager接口原本是打算用于容器集成的。雖然這可以理解,但是為JTA TransactionManager定義標準的JNDI位置還是有重大意義的,尤其是對于輕量級容器(如Spring);然后,便可以以同樣的方式來定位任意的J2EE服務器的JTA TransactionManager。
不僅Spring的JtaTransactionManager將從對JTA TransactionManager的訪問中獲益,而且O/R映射工具,比如Hibernate、Apache OJB和Kodo JDO也將從中受益,因為他們需要利用該接口在JTA環境中執行緩存同步--即在JTA事務完成時釋放緩存鎖。注冊事務同步的能力只能由JTA TransactionManager接口而不是UserTransaction句柄提供。因此,每個工具都需要實現自己特定于供應商的 TransactionManager查尋適配器。
為JTA TransactionManager定義標準的JNDI位置是許多基礎架構軟件供應商在J2EE方面的強烈愿望。如果J2EE 5.0規范的開發團隊能意識到該功能的重要性,那就太好了。幸運的是,優秀的J2EE服務器(如WebLogic Server)已經考慮將其JTA TransactionManager作為公開的API,包括特定于供應商的擴展!
結合了WebLogic JTA的Spring事務劃分
對于WebLogic Server,JTA TransactionManager的正式JNDI位置是javax.transaction.TransactionManager。在Spring 的JtaTransactionManager中,該值可被指定為“transactionManagerName”。一般來說,這啟用了使用 WebLogic JTA子系統的Spring驅動的事務掛起,激活了對PROPAGATION_REQUIRES_NEW和 PROPAGATION_NOT_SUPPORTED的支持。 代碼:
<bean id="transactionManager"
?? class="org.springframework.transaction.jta.JtaTransactionManager">
?<property name="transactionManagerName">
?? <value>javax.transaction.TransactionManager</value>
?</property>
</bean>
?
除了標準的JtaTransactionManager和它所支持的通用配置選項,Spring還支持一種特殊的WebLogicJtaTransactionManager適配器,它直接利用WebLogic的JTA擴展。
<bean id="transactionManager" class="org.springframework.transaction.jta.WebLogicJtaTransactionManager"/>
除了自動檢測WebLogic的JTA TransactionManager,它還支持不屬于標準JTA的三個重要特性:
事務名稱(Transaction name)--將Spring的事務名稱暴露給WebLogic Server,使Spring事務在WebLogic的事務監視器上可見。默認的情況下,Spring將對聲明性事務使用全限定方法名。
按事務的隔離級別(Per-transaction isolation level)--將Spring事務屬性中指定的隔離級別應用到WebLogic JTA事務。這支持按事務指定數據庫的隔離級別,而標準的JTA并不支持。
強制性事務恢復(Enforcing transaction resume)--恢復WebLogic事務,即使掛起的事務已標記為rollback-only(只能回滾)。這要求調用forceResume()方法,使用WebLogic底層的擴展的TransactionManager接口。
下面的圖像顯示的是WebLogic Server的事務監視器,它按名稱列出了一組Spring驅動的事務:
?
圖2. WebLogic Server的事務監視器(點擊圖片查看大圖)
Spring的WebLogicJtaTransactionManager實際上暴露了WebLogic Server的事務管理器針對基于Spring的應用程序的全部功能。它使Spring事務劃分成為EJB CMT的一個極具吸引人的替代方案,而且它提供同級別的事務支持。
注意,只有實際需要掛起事務或使用WebLogic的JTA擴展時,才需要對特定于WebLogic的JTA進行設置。對于標準的事務劃分(如PROPAGATION_REQUIRED或PROPAGATION_SUPPORTS),標準的JTA設置就足夠了。
Spring和EJB CMT
如上所述,針對POJO的Spring聲明性事務劃分可以看作傳統的EJB CMT的替代方案。但是,Spring和EJB并不是互相排斥的。Spring應用程序上下文也可以作為EJB外觀的后端,管理數據訪問對象(DAO)和其它的細粒度業務對象。
在EJB場景中,事務由EJB CMT驅動。Spring的數據訪問支持會自動地檢測這樣的環境并進行相應的調整。例如,Spring的Hibernate支持將為其隱式資源管理提供 EJB驅動的事務,就像它提供Spring驅動的事務一樣。它甚至提供相同的語義,而不需要對DAO代碼做任何修改。
Spring有效地將DAO實現從實際的運行時環境中分離出來。DAO可以參與到Spring事務(以哪個事務策略作為后端都可以)和EJB CMT事務中。這不僅支持其它環境中的重用,還支持在J2EE容器之外的測試中直接使用。
結束語
Spring Framework為J2EE和非J2EE環境提供了完善的事務劃分功能,具體來說就是為純Java目標對象提供聲明性事務。這允許在沒有EJB的情況下,以一種靈活和非入侵的方式便捷地進行事務劃分。與EJB相比,這些事務POJO應用程序對象可以在J2EE容器之外輕松地測試或重用。
Spring提供了多種開箱即用的事務策略,比如JtaTransactionManager和JDBC DataSourceTransactionManager,前者委托給J2EE服務器的事務協調程序,后者則針對單個JDBC DataSource(即單個的目標數據庫)執行事務。通過對后端配置進行簡單的更改,Spring就能夠輕松地調整事務策略適應另一個環境。
除了標準的JTA支持,Spring還提供與WebLogic Server的JTA擴展的完善集成,支持一些高級特性(如事務監控和按事務的隔離級別)。通過這種專門的WebLogic Server支持,WebLogic的事務管理器的全部功能都可應用于基于Spring的應用程序。
Spring事務劃分是對EJB CMT的極具吸引人的替代方案,特別是與基于POJO的輕量級架構結合后。在一個聲明性事務是選擇Local Stateless Session Bean(局部無狀態會話Bean)的惟一原因的場景中,基于Spring的POJO服務模型是一個可行的選擇,它提供更高水平的靈活性、可測試性和重用。
參考資料
Spring Framework--Spring的官方web站點。
Spring 參考手冊
JTA規范。 http://java.sun.com/products/jta/
WebLogic JTA--WebLogic的JTA擴展的說明文檔
http://e-docs.bea.com/wls/docs81/jta/jtaapi.html#1053904
posted on 2006-10-24 09:04
OMG 閱讀(2200)
評論(0) 編輯 收藏