java jta是什么,讓我們一起了解一下?
JTA是Java事務(wù)API,是一個(gè)Java企業(yè)版的應(yīng)用程序接口,在Java程序中,允許完成跨越多個(gè)XA資源的分布式事務(wù)。隔離事務(wù)與底層的資源,實(shí)現(xiàn)透明的事務(wù)管理方式,提供了跨數(shù)據(jù)庫(kù)連接(或其他JTA資源)的事務(wù)管理能力。
JTA的架構(gòu)是什么?
TA的架構(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è)方面:面向開(kāi)發(fā)人員的使用接口(事務(wù)管理器)和面向服務(wù)提供商的實(shí)現(xiàn)接口(資源管理器)。
其中開(kāi)發(fā)接口的主要部分即為 UserTransaction 對(duì)象,開(kāi)發(fā)人員通過(guò)此接口在信息系統(tǒng)中實(shí)現(xiàn)分布式事務(wù);而實(shí)現(xiàn)接口則用來(lái)規(guī)范提供商(如數(shù)據(jù)庫(kù)連接提供商)所提供的事務(wù)服務(wù),它約定了事務(wù)的資源管理功能,使得 JTA 可以在異構(gòu)事務(wù)資源之間執(zhí)行協(xié)同溝通。
JTA是如何在Java中實(shí)現(xiàn)的?
示例代碼如下:
?public?void?transferAccount()?{? ?UserTransaction?userTx?=?null;? ?Connection?connA?=?null;? ?Statement?stmtA?=?null;? ?Connection?connB?=?null;? ?Statement?stmtB?=?null;? ???? ?try{? ???????//?獲得?Transaction?管理對(duì)象 ?userTx?=?(UserTransaction)getContext().lookup("\ ???????java:comp/UserTransaction");? ?//?從數(shù)據(jù)庫(kù)?A?中取得數(shù)據(jù)庫(kù)連接 ?connA?=?getDataSourceA().getConnection();? ?//?從數(shù)據(jù)庫(kù)?B?中取得數(shù)據(jù)庫(kù)連接 ?connB?=?getDataSourceB().getConnection();? ?????? ????????????????????????//?啟動(dòng)事務(wù) ?userTx.begin(); ?//?將?A?賬戶中的金額減少?500? ?stmtA?=?connA.createStatement();? ?stmtA.execute(" ????????????update?t_account?set?amount?=?amount?-?500?where?account_id?=?'A'"); ?//?將?B?賬戶中的金額增加?500? ?stmtB?=?connB.createStatement();? ?stmtB.execute("\ ?????????????update?t_account?set?amount?=?amount?+?500?where?account_id?=?'B'"); ?//?提交事務(wù) ?userTx.commit(); ?//?事務(wù)提交:轉(zhuǎn)賬的兩步操作同時(shí)成功(數(shù)據(jù)庫(kù)?A?和數(shù)據(jù)庫(kù)?B?中的數(shù)據(jù)被同時(shí)更新) ?}?catch(SQLException?sqle){? ?try{? ?????????//?發(fā)生異常,回滾在本事務(wù)中的操縱 ??????????????????userTx.rollback(); ?//?事務(wù)回滾:轉(zhuǎn)賬的兩步操作完全撤銷? ?//(?數(shù)據(jù)庫(kù)?A?和數(shù)據(jù)庫(kù)?B?中的數(shù)據(jù)更新被同時(shí)撤銷) ?stmt.close();? ?????????????????conn.close();? ?...? ?}catch(Exception?ignore){? ?}? ?sqle.printStackTrace();? ?}?catch(Exception?ne){? ?e.printStackTrace();? ?}? ?}
以上就是小編今天的分享了,希望可以幫助到大家。