分布式事務

2021-10-16 01:11:54 字數 2174 閱讀 5580

事務四大特性acid

a:原子性(atomicity),乙個事務(transaction)中的所有操作,要麼全部完成,要麼全部不完成,不會結束在中間某個環節。

c:一致性(consistency),事務的一致性指的是在乙個事務執行之前和執行之後資料庫都必須處於一致性狀態。

i:隔離性(isolation),指的是在併發環境中,當不同的事務同時操縱相同的資料時,每個事務都有各自的完整資料空間。

d:永續性(durability),指的是只要事務成功結束,它對資料庫所做的更新就必須持久化儲存下來。

我們目前資料庫事務和隔離級別採用註解的方式定義:

// an highlighted block

@transactional

(propagation = propagation.

required

)public

void

addlmtaccountinfo

(lmtaccountinfo lmtaccountinfo)

{this

.checkacctinfoforadd

(lmtaccountinfo)

;

微服務下事務原子性的問題微服務框架下,乙個大的操作可能會分散到不同的微服務進行處理,目前的資料庫事務的機制無法保證跨服務事務的原子性,有可能最終a服務對資料的操作成功,而b服務對資料的操作失敗。

例如,我司cts和ncc在借款操作中,確認打款成功後,ncc會更新狀態、生成還款計畫,cts也會更新狀態、額度等,按理這些應該是乙個大的事務,但是由於跨服務目前無法做成乙個事務,還偶現兩邊狀態不一致的問題。

本質上來說,分布式事務就是為了保證不同資料庫的資料一致性。其它場景舉例:

解決方式一:服務聚合

服務聚合模式是最常用的服務組合模式,它根據業務流程處理的需要,以一定的順序呼叫依賴的多個微服務,對依賴的微服務返回的資料進行組合、加工和轉換,最後以一定的形式返回給使用方。

採用服務聚合的方式是解決分布式事務的一種方式,聚合服務通過本地事務的方式保證事務的原子性,但是往往會涉及複雜的資料剝離或資料同步的機制;

解決方式二:xa協議及二階段提交

mysql 從5.0.3開始支援xa協議,通過二階段提交的方式實現分布式的事務。下面是典型的xa事務的舉例:(只有舉例了單個資料庫分支,其它資料庫分支類似)

基於xa協議的二階段提交示意:

二階段提交的方式,可以比較好的解決同一服務對多個資料庫操作的分布式事務的問題,但是對於不同的微服務操作不同的資料庫並不適用,此時可以通過服務聚合和二階段提交結合的方式進行解決。

解決方式三:應用層補償

tcc程式設計模式:

l try 階段:嘗試執行,完成所有業務檢查(一致性),預留必需業務資源(準隔離性)。

l confirm 階段:確認真正執行業務,不作任何業務檢查,只使用 try 階段預留的業務資源,confirm 操作滿足冪等性。要求具備冪等設計,confirm 失敗後需要進行重試。

狀態+定時任務補償:

通過狀態記錄事務走到哪一步,通過定時任務推動事務向下一步走;ebay採用這種方式,我司也可理解為這種方式

解決方式四:基於mq事務

rocketmq提供了mq事務的功能用於支援分布式事務,我司目前未使用該機制;

該機制保證了訊息生產者若事務成功,則訊息必然會傳送出去,若事務失敗,則訊息必然發不出去。

注意:訊息消費者的事務成功,由消費者自己去保證,不提供消費失敗後回滾生產者事務的機制。

分布式 分布式事務

是資料庫執行過程中的乙個邏輯單位,由乙個有限的資料庫操作序列構成。事務的acid四大特性 原子性 atomicity 事務作為乙個整體被執行。一致性 consistency 從乙個一致的狀態轉換到另乙個一致的狀態。隔離性 isolation 多個事務併發執行時,併發事務之間互相影響的程度。永續性 d...

分布式事務 分布式事務的實現

如果在多個服務中需要對不同的資料庫進行操作。因為不同服務操作的資料庫都不同,所以保證在同乙個事務中完成操作顯然是不科學的。那實現分布式事務的思想 1 方法入口,建立一條日誌記錄,狀態定義為初始狀態,即儲存本條日誌記錄 可以儲存在資料庫中,也可以寫出到本地磁碟檔案 2 可以在非同步執行緒或在定時任務中...

分布式之分布式事務

被人問到分布式事務,之前學rabbitmq 的時候學到過rabbitmq 高階的事務,因為沒有用過,所有沒有回答好。這裡總結一下。1.單機版事務。事務的四大特性 acid a.原子性 b.一致性 c.隔離性 d.永續性 單機事務可以通過設定事務的隔離級別 參見spring 的事務隔離級別 2.分布式...