2PC(Two Phase Commit)
顧名思義,二階段提交的意思。
- 發起事務(Prepare)
事務的發起者提出一個請求(比如下單購買某個商品),要求其依賴的服務響應請求(比如鎖定優惠券,凍結庫存等等)
當所有的依賴方成都回復確認之后,事務的准備階段完畢 - 確認/取消事務(Confirm/Cncel)
當請求得到所有的依賴服務的確認后,事務的發起者通知所有執行者確認(confirm)事務
如果第一步只有有一個執行者返回失敗,則取消(Cancel)事務
需要考慮的問題:
- 執行者如果沒有收到第二步事務,如何處理?此時執行者會一起鎖定資源等待第二步事務
比起一直鎖定和超時confirm,更適合直接超時cancel - 發起者如果第一步沒有收到回復,如何處理?此時發起者無法得知是否所有執行者都鎖定資源
超時重試,多次超時當作失敗 - 發起者如果第二步沒有收到回復,如何處理?此時的發起者無法得知是否所有執行者都確認了事務
這是一個無法回滾的異常,可能需要人工介入修復數據
3PC(Three Phase Commit)
2PC的改進版本,在Prepare階段前加了一個階段:是否可提交請求
詢問是否可以執行事務提交操作,如果執行者都返回成功響應,則進入Prepare階段,否則結束事務
這一步查詢不會加鎖,降低了反復“鎖定-釋放”的可能,提高了並發。
無論是2PC還是3PC,都無法徹底解決分布式的一致性問題。
TCC(Try-Confirm-Cancel)
TCC和2PC兩階段提交類似,2PC通常是跨庫的DB層面,T本質上是一個應用層面的2PC。
優勢在於,可以自己定義數據庫操作的精度,從而降低鎖沖突、提高吞吐量。
Try、Confirm、Cancel的縮寫,又稱補償事務,要求每個分支事務實現這三個操作。
Try,對業務系統做檢測及資源預留。和二階段中提交協議,提交請求階段類似,系統會將需要確認的資源預留、鎖定,確保確認操作一定能執行成功
Confirm,確認執行業務操作。和二階段提交協議中,提交執行階段的操作類似,指系統將最終執行操作
Cancel,取消執行業務操作。比較像二階段提交協議中的回滾操作,指系統將撤消之前預留的資源,也就是撤消已執行的預留操作對系統產生的影響