說到分佈式事務,大部分人都會知道ACID,兩階段提交,TCC等常見模式。 在微服務大行其道的今天,基於Saga實現的分佈式事務則更具普適性。數據庫
微服務是將服務粒度控制在上下文內的鬆耦合的服務架構。對於微服務架構的事務建議對於數據庫提供強一致的事務,在服務上下文之間依靠最終一致性方案來解決服務之間協同的問題。json
saga是30年前的一篇數據庫論文提到的概念。 論文中定義saga事務是一個長事務,整個事務能夠由多個本地事務組成,每一個本地事務有相應的執行模塊和補償模塊,當saga事務中任意一個事務出錯了,能夠調用相關事務進行對應的補償恢復,達到事務的最終一致性。網絡
因爲分佈式系統中網絡帶來的不可靠性,saga調用服務提出了服務應該支持冪等,在服務調用超時重試狀況下,不至於產生問題。session
saga事務沒有準備階段,不具有隔離性,若是多個saga事務同時操做同一資源會遇到多線程臨界資源的狀況,產生數據丟失或者髒數據。多線程
爲解決隔離性,能夠參考TCC模式,在業務層加入session及鎖機制保證操做串型化,經過業務層面達到隔離效果。架構
saga在分佈式架構下,採用事務驅動方式,讓服務進行相關交互,業務方訂閱相關領域事件便可。 經過事件方式下降系統複雜度,提高系統擴展性,但要注意事件循環依賴的問題。框架
組成部分:分佈式
處理saga調用請求接收,分析及執行和結果查詢等內容。微服務
執行模塊根據調用圖譜生成調用任務,調用微服務處理模塊相關接口,若是執行出錯採起補償方法。線程
經過分析請求的json數據,構建調用關係圖譜,json用來描述saga事務串型調用子事務並執行子事務。