天天看點

淺談 JTA 事務

分享知識 傳遞快樂

在談 JTA 事務之前先了解一下什麼是事務和 JDBC 事務

事務

事務表示一個由一系列的資料庫操作組成的不可分割的邏輯機關,一個邏輯工作單元必須有四個屬性:原子性、一緻性、隔離性和持久性,又稱 (ACID) 屬性,隻有這樣才能成為一個事務。事務一般都是與資料庫打交道的操作,其中的操作要麼全做要麼全都不做。

Java事務的類型有三種:JDBC事務、JTA(Java Transaction API)事務和容器事務。其中JDBC的事務操作用法比較簡單,适合于處理同一個資料源的操作。JTA事務相對複雜,可以用于處理跨多個資料庫的事務,是分布式事務的一種解決方案。常見的容器事務如Spring事務,容器事務主要是J2EE應用伺服器提供的,容器事務大多是基于JTA完成,這是一個基于JNDI的,相當複雜的API實作。

Java事務API

Java事務API由三個部分組成:

  • UserTransaction - 高層的應用事務劃分接口,供客戶程式使用
  • TransactionManager - 高層的事務管理器接口,供應用伺服器使用
  • XAResource,X/Open XA協定的标準Java映射,供事務性資料總管使用。

JDBC事務

JDBC事務是單庫的事務,是基于一個Connection的,在JDBC中是通過Connection對象進行事務管理。常用的和事務相關的方法是: setAutoCommit、commit、rollback等。

JDBC事務相對來說比較簡單,主要就是通過JDBC API來控制資料庫的事務執行。

JDBC事務的優缺點

優勢:JDBC使用Java進行資料庫的事務操作提供了最基本的支援。通過JDBC事務,我們可以将多個SQL語句放到同一個事務中,保證其ACID特性。JDBC事務的主要優點就是API比較簡單,可以實作最基本的事務操作,性能也相對較好。

劣勢:JDBC事務隻能限于一個資料庫連接配接!如果涉及到多資料庫的操作或者分布式場景,JDBC事務就無能為力了。

JTA事務

什麼是JTA事務

Java事務API(Java Transaction API,簡稱JTA )是一個J2EE的應用程式接口,在Java環境中,JTA允許應用程式完成跨越多個XA資源的分布式事務,即在兩個或多個資源上通路并且更新資料。JDBC驅動程式對JTA的支援極大地增強了資料通路能力。

XA協定是資料庫層面的一套分布式事務管理的規範,JTA是XA協定在Java中的實作,多個資料庫或是消息廠商實作JTA接口,開發人員隻需要調用Spring JTA接口即可實作JTA事務管理功能。JTA事務比JDBC事務更強大。一個JTA事務可以有多個參與者,而一個JDBC事務則被限定在一個單一的資料庫連接配接。

分布式事務

分布式事務(Distributed Transaction)包括事務管理器(Transaction Manager)和一個或多個支援 XA 協定的資料總管 (Resource Manager)。

  • 事務管理器(Transaction Manager)提供事務聲明,事務資源管理,事務同步,事務上下文傳播等功能,并且負責着所有事務參與單元者的互相通訊的責任。JTA規範定義了事務管理器與其他事務參與者互動的接口,其他的事務參與者與事務管理器進行互動。
  • 資料總管(Resource Manager)是任意類型的持久化資料存儲容器;

要想使用JTA事務,就必須遵守XA規範;需要實作 javax.sql.XADataSource 、 javax.sql.XAConnection 和 javax.sql.XAResource 接口的 JDBC 驅動程式。一個實作了這些接口的驅動程式将可以參與 JTA 事務。一個 XADataSource 對象就是一個 XAConnection 對象的工廠。XAConnection 是參與 JTA 事務的 JDBC 連接配接。隻有使用 XADataSource 來産生資料庫連接配接,産生的連接配接為一個XA連接配接。

XA連接配接(javax.sql.XAConnection)和非XA(java.sql.Connection)連接配接的差別在于:XA可以參與JTA的事務,而且不支援自動送出。

JTA的優缺點

優勢:提供了分布式事務的解決方案,嚴格的ACID。

劣勢:

  • 實作複雜
  • 通常情況下 JTA UserTransaction 需要從JNDI擷取。這意味着,如果我們使用JTA,就需要同時使用JTA和JNDI。
  • JTA本身就是個笨重的API
  • 通常JTA隻能在應用伺服器環境下使用,是以使用JTA會限制代碼的複用性。
提示:标準的JTA方式的事務管理在日常開發中并不常用。

雖然JTA事務是Java提供的可用于分布式事務的一套API,也可以同時管理多個資料源的事務,但由于JTA是通過兩階段(2PC)送出,暴露出的問題也非常明顯,就是比較嚴重的性能問題,由于同時操作多個資料源;如果其中一個資料源擷取資料的時間過長,會導緻整個請求都非常的長,事務時間太長,鎖資料的時間就會太長,自然就會導緻低性能和低吞吐量。是以在實際開發過程中,對性能要求比較高的系統很少使用JTA元件做事務管理。

常用的分布式事務解決方案主要有異步消息確定型、TCC、最大努力通知等。