• <button id="eiyoe"><acronym id="eiyoe"></acronym></button>
    <em id="eiyoe"></em>

  • <rp id="eiyoe"><acronym id="eiyoe"><input id="eiyoe"></input></acronym></rp>
      查看: 1210|回復: 0
      上一主題 下一主題

      一文搞懂MySQL XA如何實現分布式事務

      80572

      主題

      0

      好友

      積分

      離線 發信

      跳轉到指定樓層
      樓主
      發表于 2021-11-30 02:35 | 只看該作者 | 倒序瀏覽
      目錄
      • 前言
      • XA 協議
      • 如何通過MySQL XA實現分布式事務

      前言

      MySQL支持單機事務的良好表現毋庸置疑,那么在分布式系統中,涉及多個節點,MySQL又是如何實現分布式事務的呢?比如開發一個業務系統,它接受外部的請求,然后訪問多個內部其它系統才能執行該請求。執行時我們需要同時更新多個數據庫的值(D1,D2,D3)。由于系統必須處于一個一致性,也就是這三個數據庫的值要么同時更新成功,要么全部不更新。不然會造成子系統有些指令成功了,有些指令尚未執行。導致對結果理解混亂。

      那么,MySQL如何實現多個MySQL數據庫更新的一致性呢?那就是MySQL XA。MySQL正是靠支持XA規范的二階段提交協議,才實現了多個數據庫的操作。

      XA 協議

      提到XA規范就得來聊一下DTP模型(Distributed Transaction Processing)。XA規范就是約定DTP模型中的兩個模塊事務管理器和資源管理器的通訊方式。DTP其實就是分布式事務處理

      在這里插入圖片描述

      各個模塊的作用如下:

      • AP(Application Program):應用程序,定義事務邊界(定義事務開始和結束)并訪問事務邊界內的資源。
      • RM(Resource Manger)資源管理器: 管理共享資源并提供外部訪問接口。供外部程序來訪問數據庫等共享資源。此外,RM還具有事務的回滾能力。
      • TM(Transaction Manager)事務管理器:TM是分布式事務的協調者,TM與每個RM進行通信,負責管理全局事務,分配事務唯一標識,監控事務的執行進度,并負責事務的提交、回滾、失敗恢復等。

      剛開始看可能覺得不好理解,總結起來該架構就是應用程序訪問及使用資環管理器提供的共享資源,通過事務管理器提供的事務接口(TX interface)定義事務操作。事務管理器和資源管理會基于XA規范執行二階段提交協議。
      XA規范流程如下圖所示

      在這里插入圖片描述

      • 應用程序AP向事務管理器TM發起事務請求
      • TM調用xa_open()建立同資源管理器的會話
      • TM調用xa_start()標記一個事務分支的開頭
      • AP訪問資源管理器RM并定義操作,比如插入記錄操作
      • TM調用xa_end()標記事務分支的結束
      • TM調用xa_prepare()通知RM做好事務分支的提交準備工作。其實就是二階段提交的提交請求階段。
      • TM調用xa_commit()通知RM提交事務分支,也就是二階段提交的提交執行階段。
      • TM調用xa_close管理與RM的會話。
        • 這些接口一定要按順序執行,比如xa_start接口一定要在xa_end之前。此外,這里千萬要注意的是事務管理器只是標記事務分支并不執行事務,事務操作最終是由應用程序通知資源管理器完成的。另外,我們來總結下XA的接口
      • xa_start:負責開啟或者恢復一個事務分支,并且管理XID到調用線程
      • xa_end:負責取消當前線程與事務分支的關系
      • xa_prepare:負責詢問RM 是否準備好了提交事務分支 xa_commit:通知RM提交事務分支
      • xa_rollback:通知RM回滾事務分支

      如何通過MySQL XA實現分布式事務

      Mysql中存在兩種XA事務,一種是內部XA事務主要用來協調存儲引擎和二進制日志,一種是外部事務可以參與到外部分布式事務中(比如多個數據庫實現的分布式事務),這里我們主要討論外部事務。

      注:MySQL中只有當隔離級別設置為Serializable的時候才能使用分布式事務。
      MySQL的XA語法如下

      XA {START|BEGIN} xid [JOIN|RESUME]
      XA PREPARE xid
      XA END xid
      XA COMMIT xid[ONE PHASE]
      XA ROLLBACK xid
      XA RECOVER[CONVERT XID ]
      

      其中xid作為事務ID,唯一表示一個事務分支,每個事務分支都有一個id。
      首先要確認是否開啟了XA 功能

      在這里插入圖片描述

      設置隔離級別為serializable

      在這里插入圖片描述

      執行結果

      在這里插入圖片描述

      首先調用“XA START ‘xid' ”命令把XA事務置于ACTIVATE狀態,接著執行構成事務的多條SQL語句(比如 update
      t1 set c1 = ‘a' where id=1),也就是指定事務的邊界。然后調用“XA END ‘xid' ”把事務放入IDLE狀態,也就是結束事務邊界。

      在這里插入圖片描述

      接著,對于一個處于IDLE狀態的XA事務,可以執行“XA PREPARE”命令或一個“XA COMMIT…ONE PHASE”命令,XA
      PREPARE來執行二階段提交協議的提交請求階段。執行“XA RECOVER”命令會列出處于PREPARED狀態的所有XA事務。XA
      COMMIT…ONE PHASE用于預備和提交事務,也就是轉換為一階段協議,直接提交事務。

      在這里插入圖片描述

      最后,調用“XA COMMIT”來提交事務(或者“XA ROLLBACK”回滾事務)。這樣就實現了全局事務的一致性了。

      在這里插入圖片描述

      通過上面的流程可以看到,在MySQL數據庫分布式事務中,MySQL的角色其實是XA事務過程中的RM,TM是連接MySQL服務器的客戶端。在分布式事務中一般會涉及到至少兩個RM,所以我們說的MySQL支持XA協議是說mysql作為RM來說的,也就是說MySQL實現了XA協議中RM應該具有的功能。

      到此這篇關于一文搞懂MySQL XA如何實現分布式事務的文章就介紹到這了,更多相關MySQL XA分布式事務內容請搜索腳本之家以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持腳本之家!

      來源:http://www.jb51.net/article/228560.htm