Spring的事務機制解析二

四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 增加了對分布式事務的支持酝润。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末袍祖,一起剝皮案震驚了整個濱河市蕉陋,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌凳鬓,老刑警劉巖患民,帶你破解...
    沈念sama閱讀 212,080評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件匹颤,死亡現(xiàn)場離奇詭異,居然都是意外死亡辽慕,警方通過查閱死者的電腦和手機赦肃,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,422評論 3 385
  • 文/潘曉璐 我一進店門他宛,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人镜撩,你說我怎么就攤上這事队塘。” “怎么了围段?”我有些...
    開封第一講書人閱讀 157,630評論 0 348
  • 文/不壞的土叔 我叫張陵奈泪,是天一觀的道長。 經常有香客問我拜姿,道長冯遂,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,554評論 1 284
  • 正文 為了忘掉前任壁却,我火速辦了婚禮展东,結果婚禮上炒俱,老公的妹妹穿的比我還像新娘。我一直安慰自己权悟,他們只是感情好,可當我...
    茶點故事閱讀 65,662評論 6 386
  • 文/花漫 我一把揭開白布处硬。 她就那樣靜靜地躺著荷辕,像睡著了一般件豌。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上骡显,一...
    開封第一講書人閱讀 49,856評論 1 290
  • 那天惫谤,我揣著相機與錄音珠洗,去河邊找鬼。 笑死许蓖,一個胖子當著我的面吹牛调衰,可吹牛的內容都是我干的嚎莉。 我是一名探鬼主播沛豌,決...
    沈念sama閱讀 39,014評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼加派,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了哼丈?” 一聲冷哼從身側響起筛严,我...
    開封第一講書人閱讀 37,752評論 0 268
  • 序言:老撾萬榮一對情侶失蹤桨啃,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后匈棘,有當地人在樹林里發(fā)現(xiàn)了一具尸體析命,經...
    沈念sama閱讀 44,212評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,541評論 2 327
  • 正文 我和宋清朗相戀三年簇搅,在試婚紗的時候發(fā)現(xiàn)自己被綠了瘩将。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片凹耙。...
    茶點故事閱讀 38,687評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡肖抱,死狀恐怖,靈堂內的尸體忽然破棺而出意述,到底是詐尸還是另有隱情泽艘,我是刑警寧澤匹涮,帶...
    沈念sama閱讀 34,347評論 4 331
  • 正文 年R本政府宣布槐壳,位于F島的核電站,受9級特大地震影響雳攘,放射性物質發(fā)生泄漏枫笛。R本人自食惡果不足惜吨灭,卻給世界環(huán)境...
    茶點故事閱讀 39,973評論 3 315
  • 文/蒙蒙 一喧兄、第九天 我趴在偏房一處隱蔽的房頂上張望吠冤。 院中可真熱鬧,春花似錦拯辙、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,777評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至撇他,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間困肩,已是汗流浹背脆侮。 一陣腳步聲響...
    開封第一講書人閱讀 32,006評論 1 266
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留潭枣,地道東北人。 一個月前我還...
    沈念sama閱讀 46,406評論 2 360
  • 正文 我出身青樓命咐,卻偏偏與公主長得像,于是被迫代替她去往敵國和親谐岁。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 43,576評論 2 349

推薦閱讀更多精彩內容

  • Spring Boot 參考指南 介紹 轉載自:https://www.gitbook.com/book/qbgb...
    毛宇鵬閱讀 46,773評論 6 342
  • Java事務的類型有三種:JDBC事務、JTA(Java Transaction API)事務塞祈、容器事務帅涂。 常見的...
    余平的余_余平的平閱讀 1,456評論 0 10
  • 這部分的參考文檔涉及數據訪問和數據訪問層和業(yè)務或服務層之間的交互。 Spring的綜合事務管理支持覆蓋很多細節(jié)漠秋,然...
    竹天亮閱讀 1,033評論 0 0
  • 5.Spring的事務 通常情況下庆锦,J2EE有2種事務管理方式:全局事務和本地事務,2種事務都比較明顯的缺陷搂抒。 全...
    FTOLsXD閱讀 1,502評論 0 8
  • 去掉所有的光環(huán)求晶,生命顯示出它本真的面目。此時衷笋,那些不甘平庸,以自己的方式堅持夢想的平凡人爵赵,顯得更有生命力,更有生而...
    燊兒閱讀 182評論 0 0