在平常項目中確定須要用到數據源,那麼數據源是什麼,當遇到分佈式事務的場景時數據源與非分佈式事務場景的數據源又有什麼不一樣呢,在J2EE中分佈式事務又是如何實現的呢,但願本文能夠解答您的疑惑。html
通俗來說,數據源是存儲數據的地方。例如,數據庫是數據源,其餘系統也能夠是數據源。在J2EE裏,數據源是表明物理數據存儲系統的實際Java對象。經過這些對象,J2EE應用能夠獲取到數據庫的JDBC鏈接。java
從UML圖上能夠看出,CommonDaraSource是對數據源概念的頂層抽象,約束了數據源必須實現的方法。數據源有三種類型的實現,分別是:面試
XA數據源指的是支持XA規範的數據源,支持分佈式事務。spring
XA規範是一種分佈式事務解決方案。X/OPEN組織定義的分佈式事務處理模型(DTP),其包含3種角色和兩個協議:sql
該模型中應用程序將一個全局事務傳送到事務管理器,事務管理器將每一個全局事務分解爲多個分支(分支事務),並將分支事務分配給單獨的資源管理器進行服務,事務管理器經過XA接口將每一個分支事務與適當的資源管理器進行協調。數據庫
若是僅在同一個事務上下文中須要協調多種資源(即數據庫以及消息主題或隊列等等),這個事務中的全部操做都必須成功,不然全部操做都將在失敗的狀況下回滾。這就是XA數據源的做用。編程
Java事務編程接口(Java Transaction API,JTA)和Java事務服務(Java Transaction Service,JTS)爲J2EE平臺提供了分佈式事務服務。後端
JTA事務是XA規範的Java實現,JTA事務有效的屏蔽了底層事務資源,使應用能夠以透明的方式參與到事務處理中。分佈式事務包括事務管理器和一個或多個支持XA協議的資源管理器。api
JTA是面向應用或應用服務器與資源管理器的高層事務接口。服務器
JTS是一組約定JTA中角色之間交互細節的規範。
JTA提供瞭如下四個接口
開發者調用UserTransaction.begin方法時,由於UserTransaction的實現類持有TransactionManager,TransactionManager充當UserTransaction和Transaction之間的橋樑,因此在調用UserTransaction的begin方法時,TransactionManager會建立Transaction事務對象,並把此對象經過ThreadLocal關聯到當前線程。當調用UserTransaction其餘方法時,會從當前線程取出事務對象Transaction對象,並經過Transaction對象找到與其關聯的XAResource對象,而後進行commit、rollback等操做。其基本流程如如下代碼:
// 建立一個Transaction,掛到當前線程上 UserTransaction userTx = null; Connection connA = null; Connection connB = null; try{ userTx.begin(); // 將Connection對應的XAResource掛到當前線程對應的Transaction connA.exec("xxx") connB.exec("xxx") // 找到Transaction關聯的XAResource,讓它們都提交 userTx.commit(); }catch(){ // 找到Transaction關聯的XAResource,讓它們都回滾 userTx.rollback(); }
本文主要介紹了數據源和XA數據源,以及分佈式事務基本原理、做用和場景以及如何使用J2EE分佈式事務,但這種是屬於基於資源層的底層分佈式事務解決方案,在業內,用來解決分佈式事務的方案還有柔性事務,柔性事務包括幾種類型:兩階段型、補償型、異步確保型和最大努力通知型,有興趣能夠更深刻的瞭解一下。
做者 | Karina Varela · Jun
翻譯 | 小青菜
來源 | https://dzone.com/articles/da... 本文有spring4all技術翻譯組完成,更多國外前沿知識和乾貨好文,歡迎關注公衆號:後端面試那些事兒。