可以這么認為,分布式事務是在分布式環境下能保證數據一致性程序單元
在說說什么是數據一致性,數據一致性是相對的,是復合邏輯的數據統一。
比如張三轉賬給李四,張三-100,李四+100. 這是一致。
比如 張三消費100 塊 獲取1000 積分, 金額-100,積分+1000. 這也是一致的。
如果我們認為 張三每消費 100 ,李四就獎勵 10 元, 張三 -100 ,李四 +10 這也是 一致的。
如果我們認為 張三 送個 李四 100 元,李四就得到 1 塊錢,張三 -100 ,李四+1 ,也是一致的。
上面你的 例子,如果 我們認為的 正確合理的 數據處理片段,正確的執行,我們就認為 是一致的。如果 一個完成一個不完成,我們就認為是不一致。
傳統事務,一個程序里面執行 只需要傳統事務 就可以 實現強一致性。
方法A 里面 調用 方法B ,然后調用了方法C ,只要在 A 方法上面加上事務,B,C 不開啟新的事務,使用A的 事務 那么不管 A ,B,C 任何地方異常都會讓事務回滾,並且 A,B,C 的數據變動會 一起提交。ACB 的 為提交 數據,相互可見。
分布式事務,還是 上面 A,B,C 的例子
但是 A,B ,C是 3 個獨立的程序了, A ,B,C中 不是本地調用,而是 RPC 調用( 不管是 什么RPC 都是走的網絡 ,不是本地調用(指的本程序內,不需要過網絡 ,不過需要過IP地址 )),
這時候本地事務明顯不生效了。
在來模擬 服務的 A 方法里面調用了 ,B服務的 B方法,然后調用的 C服務的 C方法。
然后,
1 如果 A 調用 B ,C 之前報錯,A 被事務回滾 ,B ,C 沒有調用, 這沒問題。
2 如果是 A 調用 了 B,C 以后 A 拋出異常, 那么 A 回滾了 ,B ,C 執行了 就提交了。 數據 不一致了
3 如果 A 調用 B ,然后調用 C ,C 報錯了 ,C 回滾,C 調用異常 被 A 感知,A 也會回滾,B 執行完就自己提交了,不會跟着一起回滾,數據不一致。
有人會說 我避免 3 個服務相互調用 ,我每次 只有2 個服務相互聯系
我 只會 A 調用 B ,然后 B 調用C
1 A 調用 B ,在方法的最后面 ,A 前面如果報錯 了,B不會被調用 ,如果前面沒有出錯 ,調用B,B失敗了,B回滾,異常傳遞個A,A 也回滾 , A B 之間的數據就 一致了 ,B,C 同理。
上面說的沒錯,理想環境下,如果只保持 2 層調用,並且調用 下一個服務 都在 事務提交前一刻執行 那么完全沒問題,但是 網絡環境 有一種極端情況。
A 發起一次調用B 可以拆分成幾部,A請求B ---> B 收到請求 做自己的 ---> 然后B 響應 A --> A 收到 B 的響應
這時候 如果 B做了,提交了自己, 然后響應B的時候超時, A 那邊拋出響應超時, A 不知道 B 是 做了 還是 沒做 ,A 收到 超時異常 就回滾,然后 數據就不一致了。
有人又說了,我們是是內網 無限帶寬 幾乎不會出絡異常,不考慮。網絡不考慮,但是如果 B 做了提交了事務,然后B掛了,A 依舊沒有收到響應,依舊要回滾,還是 會出數據不一致的問題。即便這些都是 小概率,然后 服務 只能保持 2 層調用,在大型 系統中依舊 明顯不適用 ,因為這樣會 鏈 會很長,調用會很不方便,然后 這個 鏈還必須是同步執行的。效率差。
解釋 分布式環境 為什么會出 一致性問題,所以分布式事務就是來解決這些問題的。
分布式事務 在我看來有4種
第1種 2pc事務,3pc事務,包括 TX-LCN 的 LCN 模式, 可以叫做 長鎖定多段式分布式事務
第2中 TCC 這種補償事務, 可以叫做短鎖定多段式分布式事務,特地額 try 階段 會獨立提交,不會多個節點相互 等待,comfrom 階段 也是相互獨立的。 比第一種效率高,但是 一個方法寫三遍,一個邏輯 分三個方向寫,編碼麻煩。
第3中,基於消息:效率沒有 長鎖定多段式分布式事務 那么低, 編碼沒有 TCC 那么麻煩。 但是需要注意的編程細節也挺多的。 總的來說算一種比較綜合的解決方案,消息機制 有個 很明顯的缺陷,它強調保證最終一致性,並不能同時回滾。 A 服務 發送給B服務的的消息,或者發出去的確認消息,只能完成, B 做失敗了,只能重試(並且保持冪等), 不能讓 A 一起回滾。 只有 主動 發起方可以終止 和回滾 這個分布式事務,入股A 提交以后,只能硬着頭皮走到底。
第4種 留給未來...................
一些相關的資料:
消息方式的的實現原理:https://www.cnblogs.com/cxygg/p/9526401.html
2pc 和 3pc 還有TCC 區別:https://www.cnblogs.com/cxygg/p/12525898.html
分布式框架 TX-LCN 的使用: https://www.cnblogs.com/cxygg/p/12410294.html
分布式事務解決方案:https://www.cnblogs.com/cxygg/p/12464016.html
分布式事務 XA 兩段式事務 X/open CAP BASE 一次分清 : https://www.cnblogs.com/cxygg/p/10813072.html