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