首先,我們說下事務,嚴格意義的事務實現應該具有4個屬性: 原子性,一致性,隔離性,永續性。這四個屬性通常稱為acid特性。
原子性: 指乙個事務不可分割,要麼成功,要麼失敗,不能有一般成功一半失敗的情況。
一致性: 指這些資料在事務執行完成這個時間點之前,讀到的一定是更新前的資料,之後讀到的一定是更新後的資料,
不應該存在乙個時刻,讓使用者讀到更新過程中的資料。
隔離性: 指乙個書屋的執行不能被其他事務干擾。即乙個事務內部的操作及使用的資料對正在進行的其他事務是隔離的,併發執行
的各個事務之間不能互相干擾。
永續性: 指乙個事務一旦完成提交,後續的其它操作和故障不會對事務的結果產生任何影響。
大部分傳統的單體關係型資料庫都完整的實現了acid,但是,對於分布式系統來說,嚴格的實現acid這四個特性幾乎是
不可能的,或者說實現代價太大,大到我們無法接受。
分布式事務就是要在分布式系統中的實現事務。在分布式系統中,在保證可用性和不嚴重犧牲效能的前提下,光是要實現資料
的一致性就已經非常困難了,所以出現了很多"殘血版"的一致性,比如順序一致性,最終一致性等等。
的不完整實現。在不同的應用場景中,有不同的實現,目的都是通過一些妥協來解決實際問題。
在實際應用中,比較常見的分布式事務實現有2pc(two-phase commit, 也叫二階段提交),tcc(try-confirm-cancel)和
事務訊息。每一種實現都有其特定的使用場景,也有各自的問題,都不是完美的解決方案。
事務訊息適用的場景主要是那些需要非同步更新資料,並對資料實時性要求不太高的場景。比如在電商的案例裡,在建立訂單
後,如果出現短暫的幾秒,購物車裡的商品沒有被及時清空,也不是完全不可接受的,只要最終購物車的資料和訂單資料
保持一致就可以了。
事務訊息需要訊息佇列提供相應的功能才能實現分布式事務(不完整的),kafka和rocketmq都提供了事務相關功能
首先,看上圖,訂單系統在訊息佇列上開啟乙個事務。然後訂單系統給訊息伺服器傳送乙個"半訊息",這個半訊息不是說
訊息內容不完整,它包含的內容就是完整的訊息內容,半訊息和普通資訊的唯一區別是,在事務提交之前,對於消費者
來說,這個訊息是不可見的。
半訊息傳送成功後,訂單系統就可以執行本地事務了,在訂單庫中建立一條訂單記錄,並提交訂單庫的資料庫事務。然後
根據本地事務的執行結果決定提交或者回滾事務訊息。如果訂單建立成功,那就提交事務訊息,購物車系統就可以消費
這條訊息繼續後續的流程。如果訂單建立失敗,那就回滾事務訊息,購物車系統就不會收到這條訊息。這樣就基本實現了
「要麼都成功,要麼都失敗」的一致性要求。
如果第四步提交事務訊息時失敗了怎麼辦?
kafka的解決方案比較簡單粗暴,直接丟擲異常,讓使用者自行處理。我們可以在業務**中反覆重試提交,直到提交成功,
或者刪除之前建立的訂單進行補償。
rocketmq的解決方案是增加了事務反查機制。我們定義producer是訂單系統,在提交或者回滾訊息時發生網路異常,
rocketmq的broker沒有收到提交或者回滾的請求,broker會定期去producer上反查這個事務對應的本地事務的狀態,
然後根據反查結果決定提交或者回滾這個事務。
為了支撐這個事務反查機制,我們的業務**需要實現乙個反查本地事務狀態的介面,告知rocketmq本地事務時成功還是
失敗。在這裡,反查本地事務的邏輯非常簡單,我們只需要根據訊息中的訂單id,在訂單庫中查詢這個訂單是否存在即可。
rocketmq會自動根據事務反查的結果提交或者回滾事務訊息。
這個反查本地事務的實現,並不依賴訊息的傳送方,也就是訂單服務的某個例項節點上的任何資料。這種情況下,即使
是傳送事務訊息的那個訂單服務節點宕機了,rocketmq依然可以通過其他訂單服務的節點來執行反查,確保事務的
完整性。
分布式 分布式事務
是資料庫執行過程中的乙個邏輯單位,由乙個有限的資料庫操作序列構成。事務的acid四大特性 原子性 atomicity 事務作為乙個整體被執行。一致性 consistency 從乙個一致的狀態轉換到另乙個一致的狀態。隔離性 isolation 多個事務併發執行時,併發事務之間互相影響的程度。永續性 d...
分布式事務 分布式事務的實現
如果在多個服務中需要對不同的資料庫進行操作。因為不同服務操作的資料庫都不同,所以保證在同乙個事務中完成操作顯然是不科學的。那實現分布式事務的思想 1 方法入口,建立一條日誌記錄,狀態定義為初始狀態,即儲存本條日誌記錄 可以儲存在資料庫中,也可以寫出到本地磁碟檔案 2 可以在非同步執行緒或在定時任務中...
分布式之分布式事務
被人問到分布式事務,之前學rabbitmq 的時候學到過rabbitmq 高階的事務,因為沒有用過,所有沒有回答好。這裡總結一下。1.單機版事務。事務的四大特性 acid a.原子性 b.一致性 c.隔離性 d.永續性 單機事務可以通過設定事務的隔離級別 參見spring 的事務隔離級別 2.分布式...