談談分布式事務

2021-07-11 16:38:27 字數 2190 閱讀 7759

只要牽涉到分布式系統,無論如何都會碰見分布式事務,當然你可以合理的拆分系統,規劃表和庫的結構,但是這只是減少分布式事務出現的次數,比方說你原來系統中有5處地方會有分布式事務,現在一優化可能只有3處地方有了,但是你要一點也沒有,個人認為不大可能

接下來談談什麼情況下會產生分布式事務?

一: 同資料庫,不同web容器

由上圖可知,我們的訂單系統和庫存系統連著相同的資料來源,該資料來源裡面也只有乙個database,裡面存放著訂單表和庫存表。因為訂單系統和庫存系統是兩個不同的系統,部署在了兩台伺服器上面,他們之間通過介面進行呼叫,所以雖然它們兩張表在同乙個資料庫裡面,但是我們無法進行事務操控。從業務上來講,當我們下單的時候,商品的庫存一定要扣除,不能庫存扣了,訂單沒生成,或者說訂單生成了,庫存沒扣,這樣不就亂套了麼?所以扣庫存和生成訂單這兩步操作,必須要麼全做,要麼全不做,這就牽涉到了分布式事務。

二 :不同資料來源,相同web容器

這次我們把下單操作和扣庫存的操作寫在了同乙個系統裡面並且部署在了一台伺服器上面,這個系統連線著兩個資料來源,分別是訂單資料庫和庫存資料庫。顯然,雖說我們吧業務邏輯寫在乙個系統裡面了,但是你連著兩個資料來源,所以又出現了分布式事務。

三不同資料庫,不同web容器

第三種情況有點類似於,第一和第二種的結合。每個系統操縱自己的資料庫,系統之間通過介面呼叫,很明顯必然又要出現分布式事務

四 單錶分片的情況

有的時候一張表的數量實在是太大了,而且增速過猛,那麼無可奈何,只能把這張表拆分成好幾份存放到不同的資料庫伺服器上面,有人會說這為什麼也會產生分布式事務呢?根據上面那張圖我舉個例子,假如庫存表分片1存的是上海倉庫的商品庫存資訊,庫存表分片2存的是北京倉庫的商品庫存資訊,現在我要進行調貨操作,從上海倉庫調走500臺iphone手機到北京倉庫,這個時候我們就要對分片1進行扣減500的操作,而對分片2進行增加500的操作,那麼我們這個操作可以允許失敗麼?我分片1(上海倉庫)的500台扣減掉了,但是分片2(北京倉庫)沒有增加成功?這顯然是不可以的,所以這牽涉到了分布式事務,當然我這裡只是舉乙個例子,因為你牽涉到了對同一張表的兩條以上的記錄進行修改操作,所以引出了分布式事務。

上面我們聊了什麼樣的情況下會出現分布式事務,接下來說下解決辦法

一:jta(二階段提交)

實際上jta嚴格來說不能解決分布式事務,比方說我上面舉的第一種情況,我是單資料來源,不同web容器,你用jta怎麼解決?jta只能解決多資料來源下的事務,而且對系統的吞吐量影響極大。

二:補償法

這個是目前最常用的方法

首先我們需要把我們的業務劃分到最細,讓每個業務成為原子業務,比方說我們有乙個業務現在可以劃分成3個原子業務,業務a,業務b,

業務c。這些業務操作可以是你直接運算元據庫,也可以是呼叫別的系統的介面

假設我們現在業務a業務b都執行成功,但是業務c這裡失敗了。那麼我們有兩條路可以走。

第一條:把業務a和業務b回滾,也就是撤銷業務a和業務b。

第二條:繼續執行業務c直到成功為止

這兩種方向我們也叫做正推和逆推,實際上第二種是我們常用的,如果你逆推的話把前面做的都撤銷掉了,我感覺意義不大,當你產生補償的行為的時候,我們的主流程實際上已經走通了,比方說你下單操作,使用者點完下單之後,你告訴它你已經成功下單,好了接下來和使用者沒關係了,這個就叫主流程結束了。但是你的下單流程裡面包含了庫存的調配,比方說我在上海下的訂單,要去北京庫房調貨,那麼牽涉到分布式事務(可以參照分布式事務的第四種情況),好了現在調北京庫房呼叫失敗,那麼我開始逆推把訂單給刪了,你覺得合適麼?還是說我繼續正推,直到我呼叫成功為止,使用者那邊我只要在訂單上顯示正在配貨中就可以了,反正你要把訂單都給刪了,那會是乙個很不好的體驗

談談分布式事務

對於分布式事務,使用者本質訴求是什麼?分布式事務解決的使用者最本質訴求是什麼?資料一致。大中企業有乙個共同的訴求是資料一致,幾乎覆蓋到各個行業。比如說零售行業,庫存與出貨的資料需要保持一致,出貨量與庫存資料不匹配,顯而易見會出問題,拿到訂單卻沒貨了,或者有貨卻下不了訂單。比如說金融行業,轉賬資料搞錯...

分布式 分布式事務

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

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

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