日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

spring整合atomikos实现分布式事务的方法示例_分布式事务中的XA和JTA

發(fā)布時間:2024/7/23 编程问答 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 spring整合atomikos实现分布式事务的方法示例_分布式事务中的XA和JTA 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

在介紹這兩個概念之前,我們先看看是什么是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模型圖如下:

包括五個參與者:

  • TM(transaction manager): 事務(wù)管理器提供支持事務(wù)界定、事務(wù)資源管理、同步和事務(wù)上下文傳播所需的服務(wù)和管理功能。
  • AS(application server): 應(yīng)用服務(wù)器提供了支持應(yīng)用程序運行時環(huán)境所需的基礎(chǔ)設(shè)施,其中包括事務(wù)狀態(tài)管理。此類應(yīng)用程序服務(wù)器的一個例子就是EJB服務(wù)器。jboss、weblogic、websphere等都是支持JTA規(guī)范的。注意:tomcat不支持JTA規(guī)范,所以只能使用第三方的TM庫,如JOTM和Atomikos。將TM直接整合進(jìn)應(yīng)用中,不再依賴于AS。
  • RM(resource manager):資源管理器為應(yīng)用程序提供對資源的訪問。RM通過實現(xiàn)事務(wù)資源接口來參與分布式事務(wù)。這個事務(wù)資源接口是給TM用于溝通事務(wù)關(guān)聯(lián)、事務(wù)完成和恢復(fù)工作的。例如關(guān)系數(shù)據(jù)庫服務(wù)器。
  • AP(application program):一個基于組件的事務(wù)型應(yīng)用程序,通過聲明性事務(wù)屬性設(shè)置提供事務(wù)管理支持。
  • CRM(communication resource manager):通信資源管理器支持事務(wù)上下文傳播和對傳入和傳出請求的事務(wù)服務(wù)的訪問。JTA規(guī)范沒有指定與通信相關(guān)的要求。有關(guān)TM之間互操作性的更多細(xì)節(jié),請參閱JTS規(guī)范。
  • JTA接口

    JTA是java擴(kuò)展包,在應(yīng)用中需要額外引入相應(yīng)的jar包依賴

    ???? javax.transaction???? jta???? 1.1

    一共8個接口:

  • XAResource:XA資源管理器接口,RM提供給TM調(diào)用。XAResource接口是基于X/Open CAE規(guī)范(分布式事務(wù)處理:XA規(guī)范)的行業(yè)標(biāo)準(zhǔn)XA接口的Java映射。
  • Xid:Xid接口是X/Open事務(wù)標(biāo)識Xid結(jié)構(gòu)的Java映射。此接口指定三個方法:,分別獲取:全局事務(wù)的格式化ID、全局事務(wù)ID和分支限定符。TM和RM使用Xid接口。此接口對AP和AS都不可見。
  • Status:定義事務(wù)狀態(tài)。共指定10個狀態(tài)
  • Synchronization:同步接口。事務(wù)同步允許AS在事務(wù)完成之前和之后從TM獲得通知。
  • Transaction:事務(wù)定義接口。每個全局事務(wù)都與一個事務(wù)對象關(guān)聯(lián)。
  • TransactionManager:事務(wù)管理器。管理事務(wù)的全生命周期。
  • TransactionSynchronizationRegistry:事務(wù)同步注冊器。用于系統(tǒng)級AS組件(如持久化管理器)。這提供了注冊具有特殊排序語義的同步對象、將資源對象與當(dāng)前事務(wù)關(guān)聯(lián)、獲取當(dāng)前事務(wù)的事務(wù)上下文、獲取當(dāng)前事務(wù)狀態(tài)以及將當(dāng)前事務(wù)標(biāo)記為回滾的能力。
  • UserTransaction:事務(wù)客戶端,封裝了用戶可直接操作事務(wù)的接口。
  • 注意

    這些接口都不需要開發(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)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。