spring整合atomikos实现分布式事务的方法示例_分布式事务中的XA和JTA
在介紹這兩個概念之前,我們先看看是什么是X/Open DTP模型。
X/Open
X/Open,即現(xiàn)在的open group,是一個獨立的組織,主要負(fù)責(zé)制定各種行業(yè)技術(shù)標(biāo)準(zhǔn)。X/Open組織主要由各大知名公司或者廠商進(jìn)行支持,這些組織不光遵循X/Open組織定義的行業(yè)技術(shù)標(biāo)準(zhǔn),也參與到標(biāo)準(zhǔn)的制定。
官網(wǎng)地址:http://www.opengroup.org/
X/Open DTP 全稱 X/Open Distributed Transaction Processing Reference是X/Open這個組織定義出的一套分布式事務(wù)標(biāo)準(zhǔn)。
DTP參考模型:https://pubs.opengroup.org/onlinepubs/9294999599/toc.pdf
X/Open DTP模型組成
X/Open DTP 定義了三個組件:AP,TM,RM 和兩個協(xié)議:XA、TX
AP(Application Program):也就是應(yīng)用程序,可以理解為使用DTP的程序
RM(Resource Manager):資源管理器,這里可以理解為一個DBMS系統(tǒng),或者消息服務(wù)器管理系統(tǒng),應(yīng)用程序通過資源管理器對資源進(jìn)行控制。
TM(Transaction Manager):事務(wù)管理器,負(fù)責(zé)協(xié)調(diào)和管理事務(wù),提供給AP應(yīng)用程序編程接口以及管理資源管理器。
XA協(xié)議:應(yīng)用或應(yīng)用服務(wù)器與事務(wù)管理之前通信的接口
TX協(xié)議:全局事務(wù)管理器與資源管理器之間通信的接口
編程方式
1. 配置TM,通過TM或者RM提供的方式,把RM注冊到TM。可以理解為給TM注冊RM作為數(shù)據(jù)源。一個TM可以注冊多個RM。
1. AP從TM獲取資源管理器的代理(例如:使用JTA接口,從TM管理的上下文中,獲取出這個TM所管理的RM的JDBC連接或JMS連接)
2. AP向TM發(fā)起一個全局事務(wù)。這時,TM會通知各個RM。XID(全局事務(wù)ID)會通知到各個RM。
3. AP通過1中獲取的連接,直接操作RM進(jìn)行業(yè)務(wù)操作。這時,AP在每次操作時把XID(包括所屬分支的信息)傳遞給RM,RM正是通過這個XID與2步中的XID關(guān)聯(lián)來知道操作和事務(wù)的關(guān)系的。
4. AP結(jié)束全局事務(wù)。此時TM會通知RM全局事務(wù)結(jié)束。
5. 開始二段提交,也就是prepare - commit的過程。
XA協(xié)議
如上圖所示,XA規(guī)范的最主要的作用是,就是定義了RM-TM的交互接口。下圖更加清晰了演示了XA規(guī)范在DTP模型中發(fā)揮作用的位置。
其實這個協(xié)議只是定義了xa_和ax_系列的函數(shù)原型以及功能描述、約束和實施規(guī)范等。至于RM和TM之間通過什么協(xié)議通信,則沒有提及。目前知名的數(shù)據(jù)庫,如Oracle, DB2等,都是實現(xiàn)了XA接口的,都可以作為RM。XA規(guī)范除了定義的RM-TM交互的接口(XA Interface)之外,還對兩階段提交協(xié)議進(jìn)行了優(yōu)化。兩階段提交和三階段提交這里不做介紹了。
XA規(guī)范中定義的RM 和 TM交互的接口如下圖所示:
JTA
上述接口規(guī)范不是針對某種語言的,java是如何來落實上述規(guī)范的呢?這就是JTA的內(nèi)容了。
JTA:Java Transaction API, Java事務(wù)API。
oracle官方JTA規(guī)范:https://download.oracle.com/otn-pub/jcp/jta-1.1-spec-oth-JSpec/jta-1_1-spec.pdf?AuthParam=1607398216_8fd3922762196dfe6e8b27eb50190cc1
規(guī)范中定義了JTA模型圖如下:
包括五個參與者:
JTA接口
JTA是java擴(kuò)展包,在應(yīng)用中需要額外引入相應(yīng)的jar包依賴
???? javax.transaction???? jta???? 1.1一共8個接口:
注意:
這些接口都不需要開發(fā)者去實現(xiàn):
- XAResource、Xid 由數(shù)據(jù)庫廠商實現(xiàn)。
- TransactionManager、UserTransaction等操作事務(wù)相關(guān)的接口由AS廠商實現(xiàn)(例如web服務(wù)就是jboss、weblogic,或者第三方事務(wù)類庫jotm、Atomikos)。
用戶只需要使用UserTransaction的實現(xiàn)類來操控事務(wù)的創(chuàng)建、提交、回滾即可,是不是輕松加愉快- -!當(dāng)然簡單點直接使用注解也是可以的。
TM供應(yīng)商:
實現(xiàn)UserTransaction、TransactionManager、Transaction、TransactionSynchronizationRegistry、Synchronization、Xid接口,通過與XAResource接口交互來實現(xiàn)分布式事務(wù)。此外,TM廠商如果要支持跨應(yīng)用的分布式事務(wù),那么還要實現(xiàn)JTS規(guī)范定義的接口。
常見的TM提供者包括我們前面提到的application server,包括:jboss、ejb server、weblogic等,以及一些以第三方類庫形式提供事務(wù)管理器功能的jotm、Atomikos。
RM供應(yīng)商:
XAResource接口需要由資源管理器者來實現(xiàn),XAResource接口中定義了一些方法,這些方法將會被TM進(jìn)行調(diào)用,如:
start方法:開啟事務(wù)分支
end方法:結(jié)束事務(wù)分支
prepare方法:準(zhǔn)備提交
commit方法:提交
rollback方法:回滾
recover方法:列出所有處于PREPARED狀態(tài)的事務(wù)分支
一些RM提供者,可能也會提供自己的Xid接口的實現(xiàn)。
此外,不同的資源管理器有一些各自的特定接口要實現(xiàn):
如JDBC2.0規(guī)范定義支持分布式事務(wù)的jdbc driver需要實現(xiàn):javax.sql.XAConnection、javax.sql.XADataSource接口
JMS1.0規(guī)范規(guī)定支持分布式事務(wù)的JMS廠商,需要實現(xiàn)javax.jms.XAConnection、javax.jms.XASession接口
開發(fā)者
用戶只需要使用UserTransaction的實現(xiàn)類來操控事務(wù)的創(chuàng)建、提交、回滾即可。
以下案例演示了UserTransaction接口的基本使用:構(gòu)建一個分布式事務(wù),來操作位于2個不同的數(shù)據(jù)庫的數(shù)據(jù),假設(shè)這兩個庫中都有一個user表。
UserTransaction userTransaction=... try{ //開啟分布式事務(wù) userTransaction.begin(); //執(zhí)行事務(wù)分支1 conn1 = db1.getConnection(); ps1= conn1.prepareStatement("INSERT into user(name,age) VALUES ('tianshouzhi',23)"); ps1.executeUpdate(); //執(zhí)行事務(wù)分支2 conn2 = db2.getConnection(); ps2 = conn2.prepareStatement("INSERT into user(name,age) VALUES ('tianshouzhi',23)"); ps2.executeUpdate(); //提交,兩階段提交發(fā)生在這個方法內(nèi)部 userTransaction.commit(); }catch (Exception e){ try { userTransaction.rollback();//回滾 } catch (SystemException ignore) { } }AS對JTA的支持
基于2個條件分析AS對JTA的支持。
1.應(yīng)用程序的事務(wù)和資源使用由AS管理。
2.對底層TM的訪問是通過資源適配器實現(xiàn)的。例如,可以使用JDBC 2.0驅(qū)動程序訪問關(guān)系數(shù)據(jù)庫(底層通過connection管理事務(wù)資源)
典型場景
如上圖:
1. 上圖底部藍(lán)色方框:RM+Adapter適配器.AS調(diào)用Adapter來創(chuàng)建TransactionalResource對象。TransactionalResource關(guān)聯(lián)2個對象:一個對象實現(xiàn)Connection接口,另一個實現(xiàn)javax.transaction.xa.XAResource接口。
2.上圖中部紅色方框:AS獲取一個TransactionalResource對象,通過getXAResource方法獲得XAResource對象。AS使用Transaction.enlistResource()方法將XAResource注冊到TM。
3.上圖左上角:TM調(diào)用XAResource.start()方法,通過Connection,將執(zhí)行的工作與事務(wù)關(guān)聯(lián)起來。
4.上圖右上角:AP調(diào)用AS的getConnection()方法來獲取Connection對象,執(zhí)行業(yè)務(wù)操作。
時序圖
附上時序圖如下:
1.AS調(diào)用TM的start()方法開啟一個事務(wù)。
2.Ap調(diào)用AS的getConnection()方法獲取Connection。
3.AS調(diào)用RM適配器的ResourceFactory.getTransactionalResource()獲取TransactionalResource對象(內(nèi)部new 一個Connection,new 一個XAResource)
4.AS調(diào)用RM適配器getXAResource()方法獲取XAResource。
5.AS調(diào)用TM的enlistResource()方法把XAResource注冊到TM中。
6.TM調(diào)用start()方法把當(dāng)前事務(wù)關(guān)聯(lián)到XAResource上。
7.AS調(diào)用TransactionalResource的getConnection()方法,并返回Connection給AP。
8.Ap通過這個Connection執(zhí)行操作。執(zhí)行完畢后close 這個connection。
9.RM適配器通知AS connection 已經(jīng)close,AS調(diào)用TM的delistResouce()刪除這些XAResource。
10.TM調(diào)用XAResource.end()方法,將事務(wù)與XAResource分離。
11.AS調(diào)用TM的commit()方法,提交事務(wù)。
12.TM調(diào)用XAResource.prepare()方法,通知RM預(yù)提交事務(wù)。
13.TM調(diào)用XAResource.commit()方法,通知RM提交事務(wù)。
參考博客:
https://www.cnblogs.com/dennyzhangdd/p/10638201.html;
http://www.tianshouzhi.com/api/tutorials/distributed_transaction/385;
總結(jié)
以上是生活随笔為你收集整理的spring整合atomikos实现分布式事务的方法示例_分布式事务中的XA和JTA的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 至强cpu型号列表_装机必看——CPU型
- 下一篇: ebs 供应商地点信息_供应商,地址,业