天天看點

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

A向賬戶B轉賬,從實作上來看,一般可以拆分為“從賬戶A中扣錢”、“向賬戶B中加錢”兩個操作步驟,兩個賬戶大多數情況下會被切分到不同的資料庫上,更多的是,兩個操作會是兩次服務調用。這兩個操作要求做到要麼同時成功、要麼同時失敗。是以引入了分布式事務問題。

下單

在電商網站上,在消費者點選購買按鈕後,交易背景會進行庫存檢查、下單、減庫存、更新訂單狀态等一連串的服務調用,每一個操作對應一個獨立的服務,服務一般會有獨立的資料庫,是以會産生分布式事務問題。

由于用一次操作,資料要寫入的資料庫不一緻,或者調用的服務都是RPC服務,那麼就會無法保證操作在同一個事務中被處理掉。是以就會存在分布式的事務問題。

全局事務的定義

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

全局事務是由資料總管管理和協調的事務。

全局事務是一個DTP模型的事務,所謂DTP模型指的是X/Open DTP(X/Open Distributed Transaction Processing Reference Model),是X/Open 這個組織定義的一套分布式事務的标準,也就是了定義了規範和API接口,由這個廠商進行具體的實作。

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中的全局事務。

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

JTS(Java Transaction Service):JTA事務管理器的實作标 準,向上支援JTA,向下通過CORBA OTS實作跨事務域的互 操作性。

EJB:基于元件的應用程式設計模型,通過聲明式事務管理進一步 簡化事務應用的程式設計。

全局事務的優缺點

全局事務,作為一種标準的分布式事務解決方案,他解決了本地事務無法滿足分布式場景中資料的ACID的要求。

關于分布式事務、兩階段送出協定、三階送出協定

中我曾經介紹過,2PC本身是存在同步阻塞問題,這就會導緻效率變低,是以,采用2PC進行事務控制的全局事務也必然存在效率低的問題。這也是全局事務最緻命的缺點,在提倡微服務的今天,這是不能容忍的。

總結

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

目前,越來越多的web開發要涉及到分布式事務,尤其是微服務架構最近越來越火,在

微服務架構

中,分布式事務是必然存在的。對于分布式事務的處理,本文主要介紹了一個典型的方案——全局事務。但是實際上,低效率的全局事務并不是很适合用來解決大型網站的分布式事務問題。

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

歡迎工作一到五年的Java程式員朋友們加入Java架構開發:744677563

本群提供免費的學習指導 架構資料 以及免費的解答

不懂得問題都可以在本群提出來 之後還會有職業生涯規劃以及面試指導