<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>

                合規國際互聯網加速 OSASE為企業客戶提供高速穩定SD-WAN國際加速解決方案。 廣告
                最早的分布式事務模型是 X/Open 國際聯盟提出的 X/Open Distributed Transaction Processing(DTP)模型,也就是大家常說的 X/Open XA 協議,簡稱 XA 協議 ![](https://img.kancloud.cn/f7/fb/f7fba491d045305781a67bc595629a89_347x250.png) DTP 模型中包含一個全局事務管理器(TM,Transaction Manager)和多個資源管理器(RM,Resource Manager)。全局事務管理器負責管理全局事務狀態與參與的資源,協同資源一起提交或回滾;資源管理器則負責具體的資源操作。 XA 協議描述了 TM 與 RM 之間的接口,允許多個資源在同一分布式事務中訪問 基于 DTP 模型的分布式事務流程大致如下: ![](https://img.kancloud.cn/41/4a/414ab85344bccb2988d23738a30c31e9_363x414.png) 1.應用程序(AP,Application)向 TM 申請開始一個全局事務。 2.針對要操作的 RM,AP 會先向 TM 注冊(TM 負責記錄 AP 操作過哪些 RM,即分支事務),TM 通過 XA 接口函數通知相應 RM 開啟分布式事務的子事務,接著 AP 就可以對該 RM 管理的資源進行操作。 3.當 AP 對所有 RM 操作完畢后,AP 根據執行情況通知 TM 提交或回滾該全局事務,TM 通過 XA 接口函數通知各 RM 完成操作。TM 會先要求各個 RM 做預提交,所有 RM 返回成功后,再要求各 RM 做正式提交,XA 協議要求,一旦 RM 預提交成功,則后續的正式提交也必須能成功;如果任意一個 RM 預提交失敗,則 TM 通知各 RM 回滾。 4.所有 RM 提交或回滾完成后,全局事務結束 ** 原子性** XA 協議使用 2PC(Two Phase Commit,兩階段提交)原子提交協議來保證分布式事務原子性。 兩階段提交是指將提交過程分為兩個階段,即準備階段(投票階段)和提交階段(執行階段): ![](https://img.kancloud.cn/f1/8a/f18a94abee25798c93fb6a74b1f88a62_362x406.png) 準備階段: TM 向每個 RM 發送準備消息。如果 RM 的本地事務操作執行成功,則返回成功;如果 RM 的本地事務操作執行失敗,則返回失敗。 提交階段 如果 TM 收到了所有 RM 回復的成功消息,則向每個 RM 發送提交消息;否則發送回滾消息;RM 根據 TM 的指令執行提交或者回滾本地事務操作,釋放所有事務處理過程中使用的鎖資源 **隔離性** XA 協議中沒有描述如何實現分布式事務的隔離性,但是 XA 協議要求 DTP 模型中的每個 RM 都要實現本地事務,也就是說,基于 XA 協議實現的分布式事務的隔離性是由每個 RM 本地事務的隔離性來保證的,當一個分布式事務的所有子事務都是隔離的,那么這個分布式事務天然的就實現了隔離性。 以 MySQL 來舉例,MySQL 使用 2PL(Two-Phase Locking,兩階段鎖)機制來控制本地事務的并發,保證隔離性。2PL 與 2PC 類似,也是將鎖操作分為加鎖和解鎖兩個階段,并且保證兩個階段完全不相交。加鎖階段,只加鎖,不放鎖。解鎖階段,只放鎖,不加鎖 ![](https://img.kancloud.cn/3c/54/3c54cb28d8ce554ea3c86d3afcf80641_358x340.png) 如上圖所示,在一個本地事務中,每執行一條更新操作之前,都會先獲取對應的鎖資源,只有獲取鎖資源成功才會執行該操作,并且一旦獲取了鎖資源就會持有該鎖資源直到本事務執行結束。 MySQL 通過這種 2PL 機制,可以保證在本地事務執行過程中,其他并發事務不能操作相同資源,從而實現了事務隔離 **一致性** 前面提到一致性有兩層語義,一層是確保事務執行結束后,數據庫從一個一致狀態轉變為另一個一致狀態。另一層語義是事務執行過程中的中間狀態不能被觀察到。 前一層語義的實現很簡單,通過原子性、隔離性以及 RM 自身一致性的實現就可以保證。至于后一層語義,我們先來看看單個 RM 上的本地事務是怎么實現的。還是以 MySQL 舉例,MySQL 通過 MVCC(Multi Version Concurrency Control,多版本并發控制)機制,為每個一致性狀態生成快照(Snapshot),每個事務看到的都是各 Snapshot 對應的一致性狀態,從而也就保證了本地事務的中間狀態不會被觀察到。 雖然單個 RM 上實現了 Snapshot,但是在分布式應用架構下,會遇到什么問題呢? ![](https://img.kancloud.cn/e6/3d/e63df9012155c7554310e68d3cbfc4d0_360x199.png) 如上圖所示,在 RM1 的本地子事務提交完畢到 RM2 的本地子事務提交完畢之間,只能讀到 RM1 上子事務執行的內容,讀不到 RM2 上的子事務。也就是說,雖然在單個 RM 上的本地事務是一致的,但是從全局來看,一個全局事務執行過程的中間狀態被觀察到了,全局一致性就被破壞了。 XA 協議并沒有定義怎么實現全局的 Snapshot,像 MySQL 官方文檔里就建議使用串行化的隔離級別來保證分布式事務一致性: “As with nondistributed transactions, SERIALIZABLE may be preferred if your applications are sensitive to read phenomena. REPEATABLE READ may not be sufficient for distributed transactions.”(對于分布式事務來說,可重復讀隔離級別不足以保證事務一致性,如果你的程序有全局一致性讀要求,可以考慮串行化隔離級別.) 當然,由于串行化隔離級別的性能較差,所以很多分布式數據庫都自己實現了分布式 MVCC 機制來提供全局的一致性讀。一個基本思路是用一個集中式或者邏輯上單調遞增的東西來控制生成全局 Snapshot,每個事務或者每條 SQL 執行時都去獲取一次,從而實現不同隔離級別下的一致性。比如 Google 的 Spanner 就是用 TrueTime 來控制訪問全局 Snapshot XA 協議是 X/Open 提出的分布式事務處理標準。文中提到的 2PC、3PC、TCC、本地事務表、Seata in AT mode,無論哪一種,本質都是事務協調者協調各個事務參與者的本地事務的進度,使使所有本地事務共同提交或回滾,最終達成一種全局的 ACID 特性。在協調的過程中,協調者需要收集各個本地事務的當前狀態,并根據這些狀態發出下一階段的操作指令。這個思想就是 XA 協議的要義,我們可以說這些事務模型遵守或大致遵守了 XA 協議 ### 優缺點 XA 協議通常實現在數據庫資源層,直接作用于資源管理器上。因此,基于 XA 協議實現的分布式事務產品,無論是分布式數據庫,還是分布式事務框架,對業務幾乎都沒有侵入,就像使用普通數據庫一樣。 XA 協議嚴格保障事務 ACID 特性,能夠滿足所有業務領域的功能需求,但是,這同樣是一把雙刃劍。 由于隔離性的互斥要求,在事務執行過程中,所有的資源都被鎖定,只適用于執行時間確定的短事務。同時,整個事務期間都是獨占數據,對于熱點數據的并發性能可能會很低,實現了分布式 MVCC 或樂觀鎖(optimistic locking)以后,性能可能會有所提升。 同時,為了保障一致性,要求所有 RM 同等可信、可靠,要求故障恢復機制可靠、快速,在網絡故障隔離的情況下,服務基本不可用
                  <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>

                              哎呀哎呀视频在线观看