Java中的事務——全局事務與本地事務

Java中的事務——全局事務與本地事務

在上一篇文章中說到過,Java事務的類型有三種:JDBC事務、JTA(Java Transaction API)事務、容器事務。這是從事務的實現角度區分的,本文從另一個角度來再次區分一下Java中的事務。java

站在事務管理的角度,能夠把Java中用到的事務分爲本地事務和全局事務。
Java中的事務——全局事務與本地事務web

本地事務sql


不用事務的編程框架來管理事務,直接使用資源管理器來控制事務。典型的就是java.sql.Connection 中的 setAutoCommit、commit、rollback方法。
Java中的事務——全局事務與本地事務數據庫

本地事務的優勢編程

  • 支持嚴格的ACID屬性
  • 可靠
  • 高效
  • 狀態能夠只在資源管理器中維護
  • 應用編程模型簡單
    本地事務的侷限服務器

  • 不具有分佈式事務處理能力
  • 隔離的最小單位由資源管理器決定,如數據庫中的一條記錄
    本地事務比較簡單,對事務不太瞭解的同窗能夠閱讀個人博客中其餘關於事務的內容。

全局事務架構


前面咱們介紹了本地事務,本地事務是咱們在編程中比較常接觸的事務,好比典型的jdbc操做,在保證ACID方面作的很是出色。可是本地事務沒法解決分佈式場景中的事務問題。框架

我前面的文章中專門介紹過度布式場景中爲何須要事務。這裏我再稍微回顧一下。異步

典型的分佈式事務場景分佈式

  • 轉帳

  • 對於銀行帳戶間轉帳的問題。帳戶A向帳戶B轉帳,從實現上來看,通常能夠拆分爲「從帳戶A中扣錢」、「向帳戶B中加錢」兩個操做步驟,兩個帳戶大多數狀況下會被切分到不一樣的數據庫上,更多的是,兩個操做會是兩次服務調用。這兩個操做要求作到要麼同時成功、要麼同時失敗。所以引入了分佈式事務問題。
  • 下單

  • 在電商網站上,在消費者點擊購買按鈕後,交易後臺會進行庫存檢查、下單、減庫存、更新訂單狀態等一連串的服務調用,每個操做對應一個獨立的服務,服務通常會有獨立的數據庫,所以會產生分佈式事務問題。
    因爲用一次操做,數據要寫入的數據庫不一致,或者調用的服務都是RPC服務,那麼就會沒法保證操做在同一個事務中被處理掉。因此就會存在分佈式的事務問題。

全局事務的定義

在上面的場景中會出現分佈式事務問題,那麼全局事務就是一個標準的分佈式事務。下面咱們嘗試着給全局事務下一個定義:

全局事務是由資源管理器管理和協調的事務。
全局事務是一個DTP模型的事務,所謂DTP模型指的是X/Open DTP(X/Open Distributed Transaction Processing Reference Model),是X/Open 這個組織定義的一套分佈式事務的標準,也就是了定義了規範和API接口,由這個廠商進行具體的實現。
Java中的事務——全局事務與本地事務

X/Open DTP 定義了三個組件:AP,TM,RM 和兩個協議:XA、TX

AP(Application Program):也就是應用程序,能夠理解爲使用DTP的程序

RM(Resource Manager):資源管理器,這裏能夠理解爲一個DBMS系統,或者消息服務器管理系統,應用程序經過資源管理器對資源進行控制。

TM(Transaction Manager):事務管理器,負責協調和管理事務,提供給AP應用程序編程接口以及管理資源管理器。

XA協議:應用或應用服務器與事務管理以前通訊的接口

TX協議:全局事務管理器與資源管理器之間通訊的接口

事務管理器控制着全局事務,管理事務生命週期,並協調資源。資源管理器負責控制和管理實際資源。

這裏還要提到一個點,就是2PC(兩階段提交),在全局事務中,爲了保證全部的操做能夠一次性要麼全提交,要麼全失敗。事務管理器和資源管理器之間的事務操做的控制是採用2PC來進行的,關於2PC,我博客中有文章專門介紹,這裏再也不贅述。

J2EE中全局事務的實現

Java自身提供了一些API能夠用來實現全局事務。Java中的事務——JDBC事務和JTA事務中介紹的JTA事務就能夠用來實現J2EE中的全局事務。
Java中的事務——全局事務與本地事務

JTA(Java Transaction API):面向應用、應用服務器與資 源管理器的高層事務接口。

JTS(Java Transaction Service):JTA事務管理器的實現標 準,向上支持JTA,向下經過CORBA OTS實現跨事務域的互 操做性。

EJB:基於組件的應用編程模型,經過聲明式事務管理進一步 簡化事務應用的編程。

全局事務的優缺點

全局事務,做爲一種標準的分佈式事務解決方案,他解決了本地事務沒法知足分佈式場景中數據的ACID的要求。

在關於分佈式事務、兩階段提交協議、三階提交協議中我曾經介紹過,2PC自己是存在同步阻塞問題,這就會致使效率變低,因此,採用2PC進行事務控制的全局事務也必然存在效率低的問題。這也是全局事務最致命的缺點,在提倡微服務的今天,這是不能容忍的。

總結


本文主要介紹了本地事務和全局事務,本地事務很簡單,在Java中可使用JDBC來實現本地事務,全局事務是一種基本的分佈式事務解決方案,是符合DTP模型的事務管理機制。

目前,愈來愈多的web開發要涉及到分佈式事務,尤爲是微服務架構最近愈來愈火,在微服務架構中,分佈式事務是必然存在的。對於分佈式事務的處理,本文主要介紹了一個典型的方案——全局事務。可是實際上,低效率的全局事務並非很適合用來解決大型網站的分佈式事務問題。

在業內,主要用來解決分佈式事務的方案是使用柔性事務。柔性事務包括幾種類型:兩階段型、補償型、異步確保型和最大努力通知型。後面我會有文章繼續介紹柔性事務。請繼續關注。

相關文章
相關標籤/搜索