四Spring事務(wù)處理器的種類
1.DataSourceTransactionManager:位于org.springframework.jdbc.datasource包中,數(shù)據(jù)源事務(wù)管理器,提供對(duì)單個(gè)javax.sql.DataSource事務(wù)管理,用于Spring JDBC抽象框架、iBATIS框架的事務(wù)管理;
2.HibernateTransactionManager:位于org.springframework.orm.hibernate3或者h(yuǎn)ibernate4包中,提供對(duì)單個(gè)org.hibernate.SessionFactory事務(wù)支持,用于集成Hibernate框架時(shí)的事務(wù)管理;該事務(wù)管理器只支持Hibernate3+版本,且Spring3.0+版本只支持Hibernate 3.2+版本;
3.JtaTransactionManager:位于org.springframework.transaction.jta包中,提供對(duì)分布式事務(wù)管理的支持,并將事務(wù)管理委托給Java EE應(yīng)用服務(wù)器事務(wù)管理器;
五Spring事務(wù)處理器的設(shè)計(jì)與實(shí)現(xiàn)
1DataSourceTransactionManager的實(shí)現(xiàn)?
? ? 在這個(gè)事務(wù)處理器中,它的實(shí)現(xiàn)直接與事務(wù)處理的底層實(shí)現(xiàn)有關(guān)。在DataSourceTransactionManager中,在事務(wù)開始的時(shí)候,會(huì)調(diào)用doBegin方法,首先會(huì)得到相對(duì)應(yīng)的Connection,然后可以根據(jù)事務(wù)設(shè)置的需要,對(duì)Connection的相關(guān)屬性進(jìn)行配置,并對(duì)像TimeoutInSeconds的事務(wù)處理參數(shù)進(jìn)行配置,最后通過TransactionSynchorinationManager來對(duì)資源進(jìn)行綁定。
DataSourceTransactionManager作為AbtractPlatformTransactionManager的子類,在AbtractPlatformTransactionManager中已經(jīng)為事務(wù)實(shí)現(xiàn)設(shè)計(jì)好了一系列的模板方法。在DataSourceTransactionManager中,可以看到對(duì)模板方法中的一些抽象方法的具體實(shí)現(xiàn)。具體來說,如果使用DataSource創(chuàng)建事務(wù),最終通過設(shè)置Connection的Autocommit屬性來對(duì)事務(wù)進(jìn)行配置。在實(shí)現(xiàn)的過程中,需要把數(shù)據(jù)庫的Connection和當(dāng)前線程進(jìn)行綁定。對(duì)于事務(wù)的提交和回滾,都是通過直接調(diào)用Connection的提交和回滾完成的,在這個(gè)實(shí)現(xiàn)的過程中,如何取得事務(wù)處理場(chǎng)景的Connection對(duì)象是一個(gè)值得注意的地方。
2 HibernateTransactionManager的實(shí)現(xiàn)
? ? 在調(diào)用HibernateTransactionManager的doBegin方法后,HibernateTransactionManager會(huì)打開一個(gè)Session,這是Hibernate的核心類,Hibernate通過他來管理數(shù)據(jù)對(duì)象的生命周期,在得到Session之后,通過他可以得到Hibernate的 Transaction,并對(duì)Transaction的參數(shù)進(jìn)行配置,然后啟動(dòng)Hibernate的 Transaction,通過TransactionSynchorinationManager來對(duì)資源進(jìn)行綁定。通過獲得通過Transaction的 Session、配置Session屬性,以及通過Session得到Hibernate的 Transaction對(duì)象來完成事務(wù)的創(chuàng)建,提交和回滾過程。
3.JtaTransactionManager的實(shí)現(xiàn)
1)JTA的分布式事務(wù)簡(jiǎn)介
Java 事務(wù)編程接口(JTA:Java Transaction API)和 Java 事務(wù)服務(wù) (JTS;Java Transaction Service) 為 J2EE 平臺(tái)提供了分布式事務(wù)服務(wù)。分布式事務(wù)(Distributed Transaction)包括事務(wù)管理器(Transaction Manager)和一個(gè)或多個(gè)支持 XA 協(xié)議的資源管理器 ( Resource Manager )。我們可以將資源管理器看做任意類型的持久化數(shù)據(jù)存儲(chǔ);事務(wù)管理器承擔(dān)著所有事務(wù)參與單元的協(xié)調(diào)與控制。JTA 事務(wù)有效的屏蔽了底層事務(wù)資源,使應(yīng)用可以以透明的方式參入到事務(wù)處理中;但是與本地事務(wù)相比,XA 協(xié)議的系統(tǒng)開銷大,在系統(tǒng)開發(fā)過程中應(yīng)慎重考慮是否確實(shí)需要分布式事務(wù)。若確實(shí)需要分布式事務(wù)以協(xié)調(diào)多個(gè)事務(wù)資源,則應(yīng)實(shí)現(xiàn)和配置所支持 XA 協(xié)議的事務(wù)資源,如 JMS、JDBC 數(shù)據(jù)庫連接池等。
2)JTA處理過程
? ? ? ? ? 分布式事務(wù)處理的第一步就是應(yīng)用程序要發(fā)送一個(gè)事務(wù)請(qǐng)求到事務(wù)管理程序。雖然最后的commit/rollback決定把事務(wù)作為一個(gè)簡(jiǎn)單的邏輯單元來對(duì)待,但是仍然可能會(huì)包括許多事務(wù)分支。一個(gè)事務(wù)分支與一個(gè)到包含在分布式事務(wù)中的每個(gè)資源管理程序相關(guān)聯(lián)。因此,到三個(gè)不同的關(guān)系數(shù)據(jù)庫管理的請(qǐng)求需要三個(gè)事務(wù)分支。每個(gè)事務(wù)分支必須由本地資源管理程序提交或者返回。事務(wù)管理程序控制事務(wù)的邊界,并且負(fù)責(zé)最后決定應(yīng)該提交或者返回的全部事務(wù)。 這個(gè)決定由兩個(gè)步驟組成,稱為Two - Phase Commit Protocol。
? ? ? ?在第一步驟中,事務(wù)管理程序輪詢所有包含在分布式事務(wù)中的資源管理程序(關(guān)系數(shù)據(jù)庫管理)來看看哪個(gè)可以準(zhǔn)備提交。如果一個(gè)資源管理程序不能提交,它將不響應(yīng),并且把事務(wù)的特定部分返回,以便數(shù)據(jù)不被修改。
? ? ? ? ?在第二步驟中,事務(wù)管理程序判斷否定響應(yīng)的資源管理程序中是否有能夠返回整個(gè)事務(wù)的。如果沒有否定響應(yīng)的話,翻譯管理程序提交整個(gè)事務(wù)并且返回結(jié)果到應(yīng)用程序中。
? ? ? ? ?開發(fā)事項(xiàng)管理程序代碼的開發(fā)者必須與所有三個(gè)JTA接口有關(guān):UserTransaction、TransactionManager和XAResource,這三個(gè)接口都被描述在Sun JTA specification中。JDBC驅(qū)動(dòng)程序開發(fā)者只需要關(guān)心XAResource接口。這個(gè)接口是允許一個(gè)資源管理程序參與事務(wù)的行業(yè)標(biāo)準(zhǔn)X/Open XA協(xié)議的Java映射。連接XAResource接口的驅(qū)動(dòng)程序組件負(fù)責(zé)在事務(wù)管理程序和資源管理程序之間擔(dān)任"翻譯"的任務(wù)。
3)JTA的實(shí)現(xiàn)原理
? ? ? JTA的架構(gòu)包括事務(wù)管理器(Transaction Manager)和一個(gè)或多個(gè)支持 XA 協(xié)議的資源管理器 ( Resource Manager ) 兩部分, 我們可以將資源管理器看做任意類型的持久化數(shù)據(jù)存儲(chǔ);事務(wù)管理器則承擔(dān)著所有事務(wù)參與單元的協(xié)調(diào)與控制。 根據(jù)所面向?qū)ο蟮牟煌?,我們可以?JTA 的事務(wù)管理器和資源管理器理解為兩個(gè)方面:面向開發(fā)人員的使用接口(事務(wù)管理器)和面向服務(wù)提供商的實(shí)現(xiàn)接口(資源管理器)。其中開發(fā)接口的主要部分即為上述示例中引用的 UserTransaction 對(duì)象,開發(fā)人員通過此接口在信息系統(tǒng)中實(shí)現(xiàn)分布式事務(wù);而實(shí)現(xiàn)接口則用來規(guī)范提供商(如數(shù)據(jù)庫連接提供商)所提供的事務(wù)服務(wù),它約定了事務(wù)的資源管理功能,使得 JTA 可以在異構(gòu)事務(wù)資源之間執(zhí)行協(xié)同溝通。以數(shù)據(jù)庫為例,IBM 公司提供了實(shí)現(xiàn)分布式事務(wù)的數(shù)據(jù)庫驅(qū)動(dòng)程序,Oracle 也提供了實(shí)現(xiàn)分布式事務(wù)的數(shù)據(jù)庫驅(qū)動(dòng)程序, 在同時(shí)使用 DB2 和 Oracle 兩種數(shù)據(jù)庫連接時(shí), JTA 即可以根據(jù)約定的接口協(xié)調(diào)者兩種事務(wù)資源從而實(shí)現(xiàn)分布式事務(wù)。
為什么必須從支持事務(wù)的數(shù)據(jù)源中獲得的數(shù)據(jù)庫連接才支持分布式事務(wù)呢?其實(shí)支持事務(wù)的數(shù)據(jù)源與普通的數(shù)據(jù)源是不同的,它實(shí)現(xiàn)了額外的 XADataSource 接口。我們可以簡(jiǎn)單的將 XADataSource 理解為普通的數(shù)據(jù)源(繼承了 java.sql.PooledConnection),只是它為支持分布式事務(wù)而增加了 getXAResource 方法。另外,由 XADataSource 返回的數(shù)據(jù)庫連接與普通連接也是不同的,此連接除了實(shí)現(xiàn) java.sql.Connection 定義的所有功能之外還實(shí)現(xiàn)了 XAConnection 接口。我們可以把 XAConnection 理解為普通的數(shù)據(jù)庫連接,它支持所有 JDBC 規(guī)范的數(shù)據(jù)庫操作,不同之處在于 XAConnection 增加了對(duì)分布式事務(wù)的支持。