互聯網分佈式高併發場景,傳統單機事務在數據庫性能和處理能力上都出現瓶頸,因而有人就基於分佈式CAP (一致性、可用性、分區容忍性)和BASE (基本可用(Basically Available)、柔性狀態(Soft State)、最終一致性(Eventual Consistency),BASE理論是大型分佈式系統場景下的設計思想,經過強一致性保證最終一致性來得到高可用性)理論提出了「柔性事務」的概念。git
與傳統單機事務嚴格遵照ACID原則不一樣,柔性事務遵照BASE理論,一般用在分佈式環境下,常見的實現方式有:兩階段提交(2PC)、TCC補償性提交,基於消息的異步確保型,最大努力通知型。github
一、2PC兩階段提交算法
2PC兩階段提交,有強一致性,是CP的典型實現。常見的標準有XA、JTA等。數據庫
缺點:協調者要等待全部參與者發出yes或至少一個發出no請後才能執行提交或中斷操做,可能會形成長時間鎖住多個只有,形成性能瓶頸,致使系統可用性很低。實現複雜,不利於擴展, 通常不多使用。併發
二、TCC補償性提交app
TCC(Try-Confirm-Cancle)是基於補償型事務的一種實現,具備最終一致性,是AP的實現。異步
特色:TCC能對分佈式事務中各個資源進行分別鎖定,分別提交與釋放,若是過後出現問題,追加執行補償性事務便可。要注意事務管理器節點要以帶同步複製語義的高可用集羣(HAC)方式部署,並使用多數派算法避免集羣發生腦裂問題。分佈式
使用場景:實時性、一致性要求高,須要獲取遠程執行結果決定邏輯業務走向,如紅包業務等。高併發
三、異步確保型性能
異步確保型是將同步事務操做變爲基於消息執行的異步操做,經過異步信息和補償性事務實現了服務的解耦,避免了分佈式事務中的同步阻塞操做的影響。
特色:本地發送事務消息到MQ並收到MQ確認後就執行commit操做,事務執行失敗,則MQ丟棄該消息,事務執行成功則MQ容許並保證消息訂閱方消費本條事務消息(訂閱方消費成功MQ將事務消息刪除,不然嘗試直到消費成功)。 此方案要求MQ支持HAC來確保事務消息不丟失。實際實現時可根據具體業務場景,先將事務消息在本地落地執行事務操做後再將消息發送到MQ,並保證本地休息到MQ,再從MQ到訂閱方過程消息不丟失(要有確認操做,失敗重試)。
使用場景: 實時性要求不高,主業務邏輯無需外部數據變動協助來完成的最終一致性事務,如跨行轉帳匯款,退貨、退款業務等。
四、最大努力通知型
最大努力通知型和前面異步確保型相似,也是基於異步消息執行,只是在消息從MQ到訂閱者時,容許在達到最大重試次數以後正常結束事務。
使用場景:對一致性要求不高,如交易結果消息通知等。
https://github.com/QNJR-GROUP/EasyTransaction
http://blog.csdn.net/congyihao/article/details/70195154