Java事務(wù)API(Java Transaction API蛋勺,簡稱JTA ) 是一個Java企業(yè)版 的應(yīng)用程序接口,
JTA和它的同胞Java事務(wù)服務(wù)(JTS宏粤;Java TransactionService)欺旧,為J2EE平臺提供了分布式事務(wù)服務(wù)澎嚣。不過JTA只是提供了一個接口瓶摆,并沒有提供具體的實(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)用疹娶。
關(guān)于分布式事務(wù)伴栓、兩階段提交協(xié)議、三階提交協(xié)議
Java中的事務(wù)——JDBC事務(wù)和JTA事務(wù)
JTA實(shí)現(xiàn)分布式事務(wù)原理
要理解 JTA 的實(shí)現(xiàn)原理首先需要了解其架構(gòu):它包括事務(wù)管理器(
Transaction Manager
)和一個或多個支持 XA 協(xié)議的資源管理器 ( Resource Manager )
兩部分, 我們可以將資源管理器看做任意類型的持久化數(shù)據(jù)存儲
钳垮;事務(wù)管理器
則承擔(dān)著所有事務(wù)參與單元的協(xié)調(diào)與控制
-
根據(jù)所面向?qū)ο蟮牟煌蟠荆梢詫?JTA 的事務(wù)管理器和資源管理器理解為兩個方面:
- 面向
開發(fā)人員
的使用接口(事務(wù)管理器) - 面向
服務(wù)提供商
的實(shí)現(xiàn)接口(資源管理器)。 - 其中開發(fā)接口的主要部分即為
UserTransaction
對象饺窿,開發(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ū)動程序肠套,Oracle 也提供了實(shí)現(xiàn)分布式事務(wù)的數(shù)據(jù)庫驅(qū)動程序舰涌, 在同時使用 DB2 和 Oracle 兩種數(shù)據(jù)庫連接時, JTA 即可以根據(jù)約定的接口協(xié)調(diào)者兩種事務(wù)資源從而實(shí)現(xiàn)分布式事務(wù)糠排。正是基于統(tǒng)一規(guī)范的不同實(shí)現(xiàn)使得 JTA 可以協(xié)調(diào)與控制不同數(shù)據(jù)庫或者 JMS 廠商的事務(wù)資源
JTA體系架構(gòu)圖
- 面向
-
JTA最重要的是三個接口:
-
UserTransaction
: 面向開發(fā)人員舵稠,開發(fā)人員通常使用該接口超升,實(shí)現(xiàn)應(yīng)用程序?qū)TA全局事務(wù)的支持入宦。 -
TransactionManager
: 事務(wù)管理器,將應(yīng)用程序?qū)Ψ植际绞聞?wù)的使用映射
到實(shí)際的事務(wù)資源并在事務(wù)資源間進(jìn)行協(xié)調(diào)與控制
室琢,所以該事務(wù)管理器在使用的時候需要單例
乾闰。 -
Transaction
: 代表了一個物理意義
上的事務(wù),實(shí)現(xiàn)真正的事務(wù)提交,回滾等操作盈滴,Transactiion.commit()
二階段提交舉例:public void commit() { // 得到當(dāng)前事務(wù)中的所有事務(wù)資源 List<XAResource> list = getAllEnlistedResouces(); // 第一準(zhǔn)備階段:通知所有的事務(wù)資源管理器涯肩,準(zhǔn)備提交事務(wù) for(XAResource xa : list){ xa.prepare(); } //第二提交階段:所有事務(wù)性資源,提交事務(wù) for(XAResource xa : list){ xa.commit(); } }
-
各接口之間調(diào)用流程:
(1)在開發(fā)人員調(diào)用UserTransaction.begin()
方法時TransactionManager
會創(chuàng)建一個Transaction
事務(wù)對象(標(biāo)志著事務(wù)的開始)并把此對象通過ThreadLocale
關(guān)聯(lián)到當(dāng)前線程巢钓。
(2)UserTransaction
接口中的commit()
病苗、rollback()
等方法都將最終
通過TransactionManager
的得到與當(dāng)前線程相關(guān)的Transaction
對象,委托給Transaction
類的對應(yīng)方法
執(zhí)行采用兩階段提交實(shí)現(xiàn)分布式事務(wù).
UserTransaction.commit(){
Transation tx = (Transation)TransactionManager.get();
tx.commit();
}
事務(wù)資源是如何以透明的方式加入到 JTA 事務(wù)中的症汹?
- 最最重要的一點(diǎn)是:在 JTA 事務(wù) 代碼中獲得的
數(shù)據(jù)庫源 ( DataSource )
必須是支持分布式事務(wù)的硫朦; -
支持事務(wù)
的數(shù)據(jù)源與普通
的數(shù)據(jù)源是不同的,實(shí)現(xiàn)了額外的XADataSource
接口背镇。 - 我們可以簡單的將
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
增加了對分布式事務(wù)的支持。通過下面的類圖讀者可以對這幾個接口的關(guān)系有所了解:
事務(wù)資源類圖
JBoss
- 由第三方服務(wù)器JBoss等實(shí)現(xiàn)分布式事務(wù)管理
UserTransaction
和TransationManager
等。 - 在應(yīng)用程序中使用
userTx = (UserTransaction)getContext().lookup("java:comp/UserTransaction");
方式獲得 Transaction 管理對象蔑鹦,也成為JNDI的方式夺克; - 我們目前基本不用。
Atomikos
- 我們目前比較主流的使用Atomikos公司旗下的事務(wù)管理器來管理分布式事務(wù)嚎朽。
- 其中該公司旗下免費(fèi)的:
TransactionEssentials
事務(wù)管理器為我們所用; - 點(diǎn)擊查看另外一篇文章對Atomikos有詳細(xì)的說明铺纽;