四Spring事務處理器的種類
1.DataSourceTransactionManager:位于org.springframework.jdbc.datasource包中坦仍,數據源事務管理器暑竟,提供對單個javax.sql.DataSource事務管理症概,用于Spring JDBC抽象框架、iBATIS框架的事務管理彼城;
2.HibernateTransactionManager:位于org.springframework.orm.hibernate3或者hibernate4包中,提供對單個org.hibernate.SessionFactory事務支持募壕,用于集成Hibernate框架時的事務管理;該事務管理器只支持Hibernate3+版本语盈,且Spring3.0+版本只支持Hibernate 3.2+版本;
3.JtaTransactionManager:位于org.springframework.transaction.jta包中黎烈,提供對分布式事務管理的支持习柠,并將事務管理委托給Java EE應用服務器事務管理器匀谣;
五Spring事務處理器的設計與實現(xiàn)
1DataSourceTransactionManager的實現(xiàn)?
? ? 在這個事務處理器中照棋,它的實現(xiàn)直接與事務處理的底層實現(xiàn)有關。在DataSourceTransactionManager中武翎,在事務開始的時候烈炭,會調用doBegin方法,首先會得到相對應的Connection,然后可以根據事務設置的需要宝恶,對Connection的相關屬性進行配置符隙,并對像TimeoutInSeconds的事務處理參數進行配置趴捅,最后通過TransactionSynchorinationManager來對資源進行綁定。
DataSourceTransactionManager作為AbtractPlatformTransactionManager的子類霹疫,在AbtractPlatformTransactionManager中已經為事務實現(xiàn)設計好了一系列的模板方法拱绑。在DataSourceTransactionManager中,可以看到對模板方法中的一些抽象方法的具體實現(xiàn)丽蝎。具體來說猎拨,如果使用DataSource創(chuàng)建事務,最終通過設置Connection的Autocommit屬性來對事務進行配置屠阻。在實現(xiàn)的過程中红省,需要把數據庫的Connection和當前線程進行綁定。對于事務的提交和回滾国觉,都是通過直接調用Connection的提交和回滾完成的吧恃,在這個實現(xiàn)的過程中,如何取得事務處理場景的Connection對象是一個值得注意的地方麻诀。
2 HibernateTransactionManager的實現(xiàn)
? ? 在調用HibernateTransactionManager的doBegin方法后痕寓,HibernateTransactionManager會打開一個Session,這是Hibernate的核心類针饥,Hibernate通過他來管理數據對象的生命周期厂抽,在得到Session之后,通過他可以得到Hibernate的 Transaction丁眼,并對Transaction的參數進行配置筷凤,然后啟動Hibernate的 Transaction,通過TransactionSynchorinationManager來對資源進行綁定苞七。通過獲得通過Transaction的 Session藐守、配置Session屬性,以及通過Session得到Hibernate的 Transaction對象來完成事務的創(chuàng)建蹂风,提交和回滾過程卢厂。
3.JtaTransactionManager的實現(xiàn)
1)JTA的分布式事務簡介
Java 事務編程接口(JTA:Java Transaction API)和 Java 事務服務 (JTS;Java Transaction Service) 為 J2EE 平臺提供了分布式事務服務惠啄。分布式事務(Distributed Transaction)包括事務管理器(Transaction Manager)和一個或多個支持 XA 協(xié)議的資源管理器 ( Resource Manager )慎恒。我們可以將資源管理器看做任意類型的持久化數據存儲;事務管理器承擔著所有事務參與單元的協(xié)調與控制撵渡。JTA 事務有效的屏蔽了底層事務資源融柬,使應用可以以透明的方式參入到事務處理中;但是與本地事務相比趋距,XA 協(xié)議的系統(tǒng)開銷大粒氧,在系統(tǒng)開發(fā)過程中應慎重考慮是否確實需要分布式事務外盯。若確實需要分布式事務以協(xié)調多個事務資源摘盆,則應實現(xiàn)和配置所支持 XA 協(xié)議的事務資源孩擂,如 JMS箱熬、JDBC 數據庫連接池等。
2)JTA處理過程
? ? ? ? ? 分布式事務處理的第一步就是應用程序要發(fā)送一個事務請求到事務管理程序护锤。雖然最后的commit/rollback決定把事務作為一個簡單的邏輯單元來對待烙懦,但是仍然可能會包括許多事務分支赤炒。一個事務分支與一個到包含在分布式事務中的每個資源管理程序相關聯(lián)。因此掩缓,到三個不同的關系數據庫管理的請求需要三個事務分支遵岩。每個事務分支必須由本地資源管理程序提交或者返回。事務管理程序控制事務的邊界舍哄,并且負責最后決定應該提交或者返回的全部事務誊锭。 這個決定由兩個步驟組成,稱為Two - Phase Commit Protocol蟆沫。
? ? ? ?在第一步驟中温治,事務管理程序輪詢所有包含在分布式事務中的資源管理程序(關系數據庫管理)來看看哪個可以準備提交罐盔。如果一個資源管理程序不能提交救崔,它將不響應捏顺,并且把事務的特定部分返回幅骄,以便數據不被修改本今。
? ? ? ? ?在第二步驟中,事務管理程序判斷否定響應的資源管理程序中是否有能夠返回整個事務的挪凑。如果沒有否定響應的話逛艰,翻譯管理程序提交整個事務并且返回結果到應用程序中。
? ? ? ? ?開發(fā)事項管理程序代碼的開發(fā)者必須與所有三個JTA接口有關:UserTransaction菇绵、TransactionManager和XAResource镇眷,這三個接口都被描述在Sun JTA specification中。JDBC驅動程序開發(fā)者只需要關心XAResource接口永乌。這個接口是允許一個資源管理程序參與事務的行業(yè)標準X/Open XA協(xié)議的Java映射具伍。連接XAResource接口的驅動程序組件負責在事務管理程序和資源管理程序之間擔任"翻譯"的任務沿猜。
3)JTA的實現(xiàn)原理
? ? ? JTA的架構包括事務管理器(Transaction Manager)和一個或多個支持 XA 協(xié)議的資源管理器 ( Resource Manager ) 兩部分, 我們可以將資源管理器看做任意類型的持久化數據存儲橄妆;事務管理器則承擔著所有事務參與單元的協(xié)調與控制祈坠。 根據所面向對象的不同,我們可以將 JTA 的事務管理器和資源管理器理解為兩個方面:面向開發(fā)人員的使用接口(事務管理器)和面向服務提供商的實現(xiàn)接口(資源管理器)慌随。其中開發(fā)接口的主要部分即為上述示例中引用的 UserTransaction 對象,開發(fā)人員通過此接口在信息系統(tǒng)中實現(xiàn)分布式事務丸逸;而實現(xiàn)接口則用來規(guī)范提供商(如數據庫連接提供商)所提供的事務服務剃袍,它約定了事務的資源管理功能,使得 JTA 可以在異構事務資源之間執(zhí)行協(xié)同溝通憔维。以數據庫為例业扒,IBM 公司提供了實現(xiàn)分布式事務的數據庫驅動程序舒萎,Oracle 也提供了實現(xiàn)分布式事務的數據庫驅動程序, 在同時使用 DB2 和 Oracle 兩種數據庫連接時虱肄, JTA 即可以根據約定的接口協(xié)調者兩種事務資源從而實現(xiàn)分布式事務交煞。
為什么必須從支持事務的數據源中獲得的數據庫連接才支持分布式事務呢?其實支持事務的數據源與普通的數據源是不同的集嵌,它實現(xiàn)了額外的 XADataSource 接口御毅。我們可以簡單的將 XADataSource 理解為普通的數據源(繼承了 java.sql.PooledConnection),只是它為支持分布式事務而增加了 getXAResource 方法凤粗。另外今豆,由 XADataSource 返回的數據庫連接與普通連接也是不同的,此連接除了實現(xiàn) java.sql.Connection 定義的所有功能之外還實現(xiàn)了 XAConnection 接口异逐。我們可以把 XAConnection 理解為普通的數據庫連接灰瞻,它支持所有 JDBC 規(guī)范的數據庫操作,不同之處在于 XAConnection 增加了對分布式事務的支持酝润。