<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ??碼云GVP開源項目 12k star Uniapp+ElementUI 功能強大 支持多語言、二開方便! 廣告
                ## 二階段提交(基于xa協議的2pc) 基于xa協議的二階段提交方案(mysql5.7以上支持) 由一個**事務管理器(TM全局事務管理) 和RM 資源管理器** 組成,分為**預提交階段和提交執行階段** * TM: Transaction Manager **事務管理器** (全局事務管理):作為**協調者**,負責各個本地資源的提交和回滾 * RM: Resource Manager **資源管理器** (數據庫、服務) : 是分布式事務的**參與者**, 通常由數據庫實現 **預提交階段:**事務管理器向每個資源管理器發送準備消息,所有參與者都會執行請求中的事務操作,只記錄日志信息但不提交,并將能否成功的信息反饋給事務管理器 **提交執行階段:**事務管理器根據準備階段的反饋結果向每個資源管理器發送消息,資源管理器執行**提交或者回滾操作** ### 優點 利用數據庫本身的事務,提高了數據強一致性的概率,實現成本較低 ### 缺點 1. 單點問題: 事務管理器唯一, 整個系統都處于停滯狀態。 2. 同步阻塞效率低: 準備階段會把資源占用并阻塞,性能差 3. 數據不一致: 第二階段如果有某個資源管理器失敗,是無法自動回滾的,會出現數據不一致。 ## TCC事務 事務補償 核心思想是:針對每個操作,都要注冊一個與其**對應的確認和補償**(撤銷)操作。 **try階段:**嘗試去執行,完成所有業務的一致性檢查,預留必須的業務資源。 **Confirm階段:**該階段對業務進行確認提交,不做任何檢查,因為try階段已經檢查過了,默認Confirm階段是不會出錯的。若Confirm階段真的出錯了,需引入重試機制或人工處理。 **Cancel 階段:**若業務執行失敗,則進入該階段,它會釋放try階段占用的所有業務資源,并回滾Confirm階段執行的所有操作。 TCC 分布式事務模型包括三部分:**主業務服務、從業務服務、業務活動管理器**。 * 主業務服務:主業務服務負責發起并完成整個業務活動。 * 從業務服務:從業務服務是整個業務活動的參與方,實現Try、Confirm、Cancel操作,供主業務服務調用。 * 業務活動管理器:業務活動管理器管理控制整個業務活動,包括記錄事務狀態,調用從業務服務的 Confirm 操作,調用從業務服務的 Cancel 操作等。 ### 優點 * 業務活動管理器也可以做集群,不像xa的事務管理器是單點 * 沒有像xa里準備階段阻塞資源的問題,效率相對較高 ### 缺點 * 相當于把數據庫的事務使用業務代碼的形式進行開發,應用侵入性強,開發成本高 ## Tcc詳細介紹 下面再拿用戶下單購買禮物作為例子來模擬TCC實現分布式事務的過程: 假設用戶A余額為100金幣,擁有的禮物為5朵。A花了10個金幣,下訂單,購買10朵玫瑰。余額、訂單、禮物都在不同數據庫。 ### TCC的Try階段: * 生成一條訂單記錄,訂單狀態為待確認。 * 將用戶A的賬戶金幣中余額更新為90,凍結金幣為10(預留業務資源) * 將用戶的禮物數量為5,預增加數量為10。 * Try成功之后,便進入Confirm階段 * Try過程發生任何異常,均進入Cancel階段 ### TCC的Confirm階段: * 訂單狀態更新為已支付 * 更新用戶余額為90,可凍結為0 * 用戶禮物數量更新為15,預增加為0 * Confirm過程發生任何異常,均進入Cancel階段 * Confirm過程執行成功,則該事務結束 ### TCC的Cancel階段: * 修改訂單狀態為已取消 * 更新用戶余額回100 * 更新用戶禮物數量為5 ## Xa和tcc區別 都是強一致性 XA是數據庫(資源)層面的分布式事務,在兩階段提交的整個過程中,一直會持有資源的鎖。 TCC是業務層面的分布式事務,不會一直持有資源的鎖。 ## 基于分布式消息的最終一致性方案 將需要分布式處理的事務通過消息或者日志的方式異步執行,消息或日志可以存到本地文件、數據庫或消息隊列中,再通過業務規則進行失敗重試。 1.A系統先發送消息到mq,如果這個prepared消息發送失敗那么就直接取消操作別執行了 2.如果這個消息發送成功過了,那么接著執行本地事務,如果成功就告訴mq發送確認消息,如果失敗就告訴mq回滾消息 3.如果發送了確認消息,那么此時B系統會接收到確認消息,然后執行本地的事務 4.mq會自動定時輪詢所有消息回調你的接口,問你,這個消息是不是本地事務處理失敗了,所有沒發送確認消息?那是繼續重試還是回滾?一般來說這里你就可以查下數據庫看之前本地事務是否執行,如果回滾了,那么這里也回滾吧。這個就是避免可能本地事務執行成功了,別確認消息發送失敗了。 5.這個方案里,要是系統B的事務失敗了咋辦?重試咯,自動不斷重試直到成功,如果實在是不行,要么就是針對重要的資金類業務進行回滾,比如B系統本地回滾后,想辦法通知系統A也回滾;或者是發送報警由人工來手工回滾和補償
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看