編輯 Java 中的事務(wù) — JDBC 事務(wù)和 JTA 事務(wù)

Java事務(wù)的類型有三種:JDBC事務(wù)捧颅、JTA(Java Transaction API)事務(wù)景图、容器事務(wù)。 常見的容器事務(wù)如Spring事務(wù)碉哑,容器事務(wù)主要是J2EE應(yīng)用服務(wù)器提供的挚币,容器事務(wù)大多是基于JTA完成,這是一個(gè)基于JNDI的扣典,相當(dāng)復(fù)雜的API實(shí)現(xiàn)妆毕。所以本文暫不討論容器事務(wù)。本文主要介紹J2EE開發(fā)中兩個(gè)比較基本的事務(wù):JDBC事務(wù)和JTA事務(wù)激捏。

JDBC事務(wù)

JDBC的一切行為包括事務(wù)是基于一個(gè)Connection的设塔,在JDBC中是通過Connection對(duì)象進(jìn)行事務(wù)管理。在JDBC中远舅,常用的和事務(wù)相關(guān)的方法是: setAutoCommit闰蛔、commit、rollback等图柏。

下面看一個(gè)簡(jiǎn)單的JDBC事務(wù)代碼:

JDBC事務(wù)的優(yōu)缺點(diǎn)

JDBC為使用Java進(jìn)行數(shù)據(jù)庫的事務(wù)操作提供了最基本的支持序六。通過JDBC事務(wù),我們可以將多個(gè)SQL語句放到同一個(gè)事務(wù)中蚤吹,保證其ACID特性例诀。JDBC事務(wù)的主要優(yōu)點(diǎn)就是API比較簡(jiǎn)單,可以實(shí)現(xiàn)最基本的事務(wù)操作裁着,性能也相對(duì)較好繁涂。

但是,JDBC事務(wù)有一個(gè)局限:一個(gè) JDBC 事務(wù)不能跨越多個(gè)數(shù)據(jù)庫6邸H幼铩!所以桶雀,如果涉及到多數(shù)據(jù)庫的操作或者分布式場(chǎng)景矿酵,JDBC事務(wù)就無能為力了唬复。

JTA事務(wù)

為什么需要JTA

通常,JDBC事務(wù)就可以解決數(shù)據(jù)的一致性等問題全肮,鑒于他用法相對(duì)簡(jiǎn)單敞咧,所以很多人關(guān)于Java中的事務(wù)只知道有JDBC事務(wù),或者有人知道框架中的事務(wù)(比如Hibernate辜腺、Spring)等休建。但是,由于JDBC無法實(shí)現(xiàn)分布式事務(wù)哪自,而如今的分布式場(chǎng)景越來越多丰包,所以,JTA事務(wù)就應(yīng)運(yùn)而生壤巷。

如果邑彪,你在工作中沒有遇到JDBC事務(wù)無法解決的場(chǎng)景,那么只能說你做的項(xiàng)目還都太小胧华。拿電商網(wǎng)站來說寄症,我們一般把一個(gè)電商網(wǎng)站橫向拆分成商品模塊、訂單模塊矩动、購物車模塊有巧、消息模塊、支付模塊等悲没。然后我們把不同的模塊部署到不同的機(jī)器上篮迎,各個(gè)模塊之間通過遠(yuǎn)程服務(wù)調(diào)用(RPC)等方式進(jìn)行通信。以一個(gè)分布式的系統(tǒng)對(duì)外提供服務(wù)示姿。

一個(gè)支付流程就要和多個(gè)模塊進(jìn)行交互甜橱,每個(gè)模塊都部署在不同的機(jī)器中,并且每個(gè)模塊操作的數(shù)據(jù)庫都不一致栈戳,這時(shí)候就無法使用JDBC來管理事務(wù)岂傲。我們看一段代碼:


JTA事務(wù)比JDBC事務(wù)更強(qiáng)大。一個(gè)JTA事務(wù)可以有多個(gè)參與者子檀,而一個(gè)JDBC事務(wù)則被限定在一個(gè)單一的數(shù)據(jù)庫連接镊掖。下列任一個(gè)Java平臺(tái)的組件都可以參與到一個(gè)JTA事務(wù)中:JDBC連接、JDO PersistenceManager 對(duì)象褂痰、JMS 隊(duì)列亩进、JMS 主題、企業(yè)JavaBeans(EJB)缩歪、一個(gè)用J2EE Connector Architecture 規(guī)范編譯的資源分配器镐侯。

JTA的定義

Java事務(wù)API(Java Transaction API,簡(jiǎn)稱JTA ) 是一個(gè)Java企業(yè)版 的應(yīng)用程序接口,在Java環(huán)境中苟翻,允許完成跨越多個(gè)XA資源的分布式事務(wù)。

JTA和它的同胞Java事務(wù)服務(wù)(JTS骗污;Java TransactionService)崇猫,為J2EE平臺(tái)提供了分布式事務(wù)服務(wù)。不過JTA只是提供了一個(gè)接口需忿,并沒有提供具體的實(shí)現(xiàn)诅炉,而是由j2ee服務(wù)器提供商 根據(jù)JTS規(guī)范提供的,常見的JTA實(shí)現(xiàn)有以下幾種:

1.J2EE容器所提供的JTA實(shí)現(xiàn)(JBoss)

2.獨(dú)立的JTA實(shí)現(xiàn):如JOTM屋厘,Atomikos.這些實(shí)現(xiàn)可以應(yīng)用在那些不使用J2EE應(yīng)用服務(wù)器的環(huán)境里用以提供分布事事務(wù)保證涕烧。如Tomcat,Jetty以及普通的java應(yīng)用。

JTA里面提供了 java.transaction.UserTransaction ,里面定義了下面幾個(gè)方法

begin:開啟一個(gè)事務(wù)

commit:提交當(dāng)前事務(wù)

rollback:回滾當(dāng)前事務(wù)

setRollbackOnly:把當(dāng)前事務(wù)標(biāo)記為回滾

setTransactionTimeout:設(shè)置事務(wù)的事件汗洒,超過這個(gè)事件议纯,就拋出異常,回滾事務(wù)

這里溢谤,值得注意的是瞻凤,不是使用了UserTransaction就能把普通的JDBC操作直接轉(zhuǎn)成JTA操作,JTA對(duì)DataSource世杀、Connection和Resource 都是有要求的阀参,只有符合XA規(guī)范,并且實(shí)現(xiàn)了XA規(guī)范的相關(guān)接口的類才能參與到JTA事務(wù)中來瞻坝,關(guān)于XA規(guī)范蛛壳,請(qǐng)看我的另外一篇文章中有相關(guān)介紹。這里所刀,提一句衙荐,目前主流的數(shù)據(jù)庫都支持XA規(guī)范。

要想使用用 JTA 事務(wù)勉痴,那么就需要有一個(gè)實(shí)現(xiàn) javax.sql.XADataSource 赫模、 javax.sql.XAConnection 和 javax.sql.XAResource 接口的 JDBC 驅(qū)動(dòng)程序。一個(gè)實(shí)現(xiàn)了這些接口的驅(qū)動(dòng)程序?qū)⒖梢詤⑴c JTA 事務(wù)蒸矛。一個(gè) XADataSource 對(duì)象就是一個(gè) XAConnection 對(duì)象的工廠瀑罗。XAConnection 是參與 JTA 事務(wù)的 JDBC 連接。

要使用JTA事務(wù)雏掠,必須使用XADataSource來產(chǎn)生數(shù)據(jù)庫連接斩祭,產(chǎn)生的連接為一個(gè)XA連接。

XA連接(javax.sql.XAConnection)和非XA(java.sql.Connection)連接的區(qū)別在于:XA可以參與JTA的事務(wù)乡话,而且不支持自動(dòng)提交摧玫。


上面的例子就是一個(gè)使用JTA事務(wù)的轉(zhuǎn)賬操作,該操作相對(duì)依賴于J2EE容器,并且需要通過JNDI的方式獲取UserTransaction和Connection诬像。

標(biāo)準(zhǔn)的分布式事務(wù)

一個(gè)分布式事務(wù)(Distributed Transaction)包括一個(gè)事務(wù)管理器(transaction manager)和一個(gè)或多個(gè)資源管理器(resource manager)屋群。一個(gè)資源管理器(resource manager)是任意類型的持久化數(shù)據(jù)存儲(chǔ)。事務(wù)管理器(transaction manager)承擔(dān)著所有事務(wù)參與單元者的相互通訊的責(zé)任坏挠。

JTA的實(shí)現(xiàn)方式也是基于以上這些分布式事務(wù)參與者實(shí)現(xiàn)的芍躏,具體的關(guān)于JTA的實(shí)現(xiàn)細(xì)節(jié)不是本文的重點(diǎn),感興趣的同學(xué)可以閱讀JTA 深度歷險(xiǎn) – 原理與實(shí)現(xiàn)降狠。

看上面關(guān)于分布式事務(wù)的介紹是不是和2PC中的事務(wù)管理比較像对竣?的卻,2PC其實(shí)就是符合XA規(guī)范的事務(wù)管理器協(xié)調(diào)多個(gè)資源管理器的一種實(shí)現(xiàn)方式榜配。 我之前有幾篇文章關(guān)于2PC和3PC的否纬,那幾篇文章中介紹過分布式事務(wù)中的事務(wù)管理器是如何協(xié)調(diào)多個(gè)事務(wù)的統(tǒng)一提交或回滾的,后面我還會(huì)有幾篇文章詳細(xì)的介紹一下和分布式事務(wù)相關(guān)的內(nèi)容蛋褥,包括但不限于全局事務(wù)临燃、DTP模型、柔性事務(wù)等壁拉。

JTA的優(yōu)缺點(diǎn)

JTA的優(yōu)點(diǎn)很明顯谬俄,就是提供了分布式事務(wù)的解決方案,嚴(yán)格的ACID弃理。但是溃论,標(biāo)準(zhǔn)的JTA方式的事務(wù)管理在日常開發(fā)中并不常用,因?yàn)樗泻芏嗳秉c(diǎn):

實(shí)現(xiàn)復(fù)雜

通常情況下痘昌,JTA UserTransaction需要從JNDI獲取钥勋。這意味著,如果我們使用JTA辆苔,就需要同時(shí)使用JTA和JNDI算灸。

JTA本身就是個(gè)笨重的API

通常JTA只能在應(yīng)用服務(wù)器環(huán)境下使用,因此使用JTA會(huì)限制代碼的復(fù)用性驻啤。

總結(jié)

Java事務(wù)的類型有三種:JDBC事務(wù)菲驴、JTA(Java Transaction API)事務(wù)、容器事務(wù)骑冗,其中JDBC的事務(wù)操作用法比較簡(jiǎn)單赊瞬,適合于處理同一個(gè)數(shù)據(jù)源的操作。JTA事務(wù)相對(duì)復(fù)雜贼涩,可以用于處理跨多個(gè)數(shù)據(jù)庫的事務(wù)巧涧,是分布式事務(wù)的一種解決方案。

這里還要簡(jiǎn)單說一下遥倦,雖然JTA事務(wù)是Java提供的可用于分布式事務(wù)的一套API谤绳,但是不同的J2EE平臺(tái)的實(shí)現(xiàn)都不一樣,并且都不是很方便使用,所以缩筛,一般在項(xiàng)目中不太使用這種較為負(fù)責(zé)的API∠裕現(xiàn)在業(yè)內(nèi)比較常用的分布式事務(wù)解決方案主要有異步消息確保型、TCC歪脏、最大努力通知等疑俭。關(guān)于這幾種分布式事務(wù)解決方案,我會(huì)在后面的文章中介紹婿失。歡迎關(guān)注與交流。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末啄寡,一起剝皮案震驚了整個(gè)濱河市豪硅,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌挺物,老刑警劉巖懒浮,帶你破解...
    沈念sama閱讀 211,639評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異识藤,居然都是意外死亡砚著,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,277評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門痴昧,熙熙樓的掌柜王于貴愁眉苦臉地迎上來稽穆,“玉大人,你說我怎么就攤上這事赶撰∩嘞猓” “怎么了?”我有些...
    開封第一講書人閱讀 157,221評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵豪娜,是天一觀的道長(zhǎng)餐胀。 經(jīng)常有香客問我,道長(zhǎng)瘤载,這世上最難降的妖魔是什么否灾? 我笑而不...
    開封第一講書人閱讀 56,474評(píng)論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮鸣奔,結(jié)果婚禮上墨技,老公的妹妹穿的比我還像新娘。我一直安慰自己溃蔫,他們只是感情好健提,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,570評(píng)論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著伟叛,像睡著了一般私痹。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,816評(píng)論 1 290
  • 那天紊遵,我揣著相機(jī)與錄音账千,去河邊找鬼。 笑死暗膜,一個(gè)胖子當(dāng)著我的面吹牛匀奏,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播学搜,決...
    沈念sama閱讀 38,957評(píng)論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼娃善,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了瑞佩?” 一聲冷哼從身側(cè)響起聚磺,我...
    開封第一講書人閱讀 37,718評(píng)論 0 266
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎炬丸,沒想到半個(gè)月后瘫寝,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,176評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡稠炬,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,511評(píng)論 2 327
  • 正文 我和宋清朗相戀三年焕阿,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片首启。...
    茶點(diǎn)故事閱讀 38,646評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡暮屡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出闽坡,到底是詐尸還是另有隱情栽惶,我是刑警寧澤,帶...
    沈念sama閱讀 34,322評(píng)論 4 330
  • 正文 年R本政府宣布疾嗅,位于F島的核電站外厂,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏代承。R本人自食惡果不足惜汁蝶,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,934評(píng)論 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望论悴。 院中可真熱鬧掖棉,春花似錦、人聲如沸膀估。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,755評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽察纯。三九已至帕棉,卻和暖如春针肥,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背香伴。 一陣腳步聲響...
    開封第一講書人閱讀 31,987評(píng)論 1 266
  • 我被黑心中介騙來泰國(guó)打工慰枕, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人即纲。 一個(gè)月前我還...
    沈念sama閱讀 46,358評(píng)論 2 360
  • 正文 我出身青樓具帮,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親低斋。 傳聞我的和親對(duì)象是個(gè)殘疾皇子蜂厅,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,514評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容