事務就是多個原子操作的組合。在事務中,如果其中乙個操作執行失敗,那麼剩下的操作都不再執行,而之前執行過的操作也需要回滾。
事務有原子性、一致性、隔離性、永續性四個特性,取英文名的首字母,簡稱為acid特性。
1.原子性(atomicity):乙個事務是乙個不可分割的工作單位,事務中包括的諸操作要麼都做,要麼都不做。
3.隔離性(isolation):乙個事務的執行不能被其他事務干擾。即乙個事務內部的操作及使用的資料對併發的其他事務是隔離的,併發執行的各個事務之間不能互相干擾。
4.永續性(durability):永續性也稱永久性,指乙個事務一旦提交,它對資料庫中資料的改變就應該是永久性的。接下來的其他操作或故障不應該對其有任何影響。
分布式事務,顧名思義就是包含對分布式系統中不同節點的操作的事務,可以理解為將對同一庫事務的概念擴大到了對多個庫的事務,目的是為了保證分布式系統中的資料一致性。
通俗來講,就是一次大的操作由不同的小操作組成,這些小的操作分布在不同的伺服器上,且屬於不同的應用,分布式事務需要保證這些小操作要麼全部成功,要麼全部失敗。本質上來說,分布式事務就是為了保證不同資料庫的資料一致性。
分布式事務處理的關鍵是:必須有一種方法可以知道事務在任何地方所做的所有動作,提交或回滾事務的決定必須產生統一的結果:全部提交或全部回滾 。
兩階段提交(two-phase commit,2pc),通過引入協調者(coordinator)來協調參與者的行為,並最終決定這些參與者是否要真正執行事務。
執行過程:
* 準備階段:
協調者詢問參與者事務是否執行成功,參與者發回事務執行結果。
* 提交階段:
如果事務在每個參與者上都執行成功,事務協調者傳送通知讓參與者提交事務;否則,協調者傳送通知讓參與者回滾事務。
存在的問題:
* 同步阻塞:
所有事務參與者在等待其它參與者響應的時候都處於同步阻塞狀態,無法進行其它操作。
* 單點問題:
協調者在 2pc 中起到非常大的作用,發生故障將會造成很大影響。特別是在階段二發生故障,所有參與者會一直等待狀態,無法完成其它操作。
* 資料不一致:
在階段二,如果協調者只傳送了部分 commit 訊息,此時網路發生異常,那麼只有部分參與者接收到 commit 訊息,也就是說只有部分參與者提交了事務,使得系統資料不一致。
* 容錯機制差:
任意乙個節點失敗就會導致整個事務失敗,沒有完善的容錯機制。
tcc方案是對兩階段提交的一種改進,其核心思想是:針對每個操作,都要註冊乙個與其對應的確認和補償(撤銷)操作。它分為三個階段:
* try 階段主要是對業務系統做檢測及資源預留
* confirm 階段主要是對業務系統做確認提交,try階段執行成功並開始執行 confirm階段時,預設 confirm階段是不會出錯的。即:只要try成功,confirm一定成功。
* cancel 階段主要是在業務執行錯誤,需要回滾的狀態下執行的業務取消,預留資源釋放。
存在的問題:
* 對應用的侵入性強:
業務邏輯的每個分支都需要實現 try、confirm、cancel 三個操作,應用侵入性較強,改造成本高。
* 實現難度較大:
需要按照網路狀態、系統故障等不同的失敗原因實現不同的回滾策略。為了滿足一致性的要求,confirm 和 cancel 介面必須實現冪等。
第一階段:
事務開始
扣除 a 賬號減少 100 元金額
向事件表插入一條記錄
事務結束
第二階段:
定時器定時查詢事件表
向訊息佇列寫入訊息
第三階段:
事務開始
向訊息執行日誌表增加一條記錄(冪等性設計,避免訊息重複執行)
向 b 賬號增加 100 元金額
事務結束
優缺點:
優點:
一種非常經典的實現,避免了分布式事務,實現了最終一致性。
缺點: 訊息表會耦合到業務系統中,如果沒有封裝好的解決方案,會有很多雜活需要處理。
針對本地訊息表解決方案做出的改進,有一些第三方的mq是支援事務訊息的,比如rocketmq,他們支援事務訊息的方式也是類似於採用的二階段提交,但是市面上一些主流的mq都是不支援事務訊息的,比如 rabbitmq 和 kafka 都不支援。
優缺點:
優點:
實現了最終一致性,不需要依賴本地資料庫事務。
缺點: 實現難度大,主流 mq 不支援,rocketmq 事務訊息部分**也未開源。
事務 分布式事務解決方案
事務acid特性 事務隔離級別 指的是讀和寫同時出現時出現的資料不一致問題。事務的一致性問題 存在問題問題描述 髒讀 dirty read 針對的是單條資料。即乙個更新操作a修改了某一條資料,但尚未提交該事務,此時另乙個讀操作b來查詢該條資料,讀到的是修改後的但尚未提交的資料。不可重複讀 unrep...
分布式事務解決方案
一 結合mq訊息中介軟體實現的可靠訊息最終一致性 二 tcc補償性事務解決 三 最大努力通知型方案 第一種方案 可靠訊息最終一致性,需要業務系統結合mq訊息中介軟體實現,在實現過程中需要保證訊息的成功傳送及成功消費。即需要通過業務系統控制mq的訊息狀態 第二種方案 tcc補償性,分為三個階段tryi...
分布式事務解決方案
當資料庫單錶一年產生的資料超過1000w,那麼就要考慮分庫分表,具體分庫分表的原理在此不做解釋,以後有空詳細說,簡單的說就是原來的乙個資料庫變成了多個資料庫。這時候,如果乙個操作既訪問01庫,又訪問02庫,而且要保證資料的一致性,那麼就要用到分布式事務。所謂的soa化,就是業務的服務化。比如原來單機...