一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

Mysql|Sql Server|Oracle|Redis|MongoDB|PostgreSQL|Sqlite|DB2|mariadb|Access|數據庫技術|

服務器之家 - 數據庫 - Mysql - 一文搞懂MySQL XA如何實現分布式事務

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

2021-12-02 16:50神技圈子 Mysql

MySQL如何實現多個MySQL數據庫更新的一致性呢?那就是MySQL XA,本文就來介紹一下MySQL XA如何實現分布式事務,具有一定的參考價值,感興趣的可以了解一下

前言

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

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

xa 協議

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

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

各個模塊的作用如下:

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

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

一文搞懂MySQL 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語法如下

?
1
2
3
4
5
6
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 功能

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

設置隔離級別為serializable

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

執行結果

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

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

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

接著,對于一個處于idle狀態的xa事務,可以執行“xa prepare”命令或一個“xa commit…one phase”命令,xa
prepare來執行二階段提交協議的提交請求階段。執行“xa recover”命令會列出處于prepared狀態的所有xa事務。xa
commit…one phase用于預備和提交事務,也就是轉換為一階段協議,直接提交事務。

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

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

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

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

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

原文鏈接:https://blog.csdn.net/songguangfan/article/details/121194345

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 很黄的孕妇a级黄毛片 | x8x8国产在线观看2021 | 国产精品制服丝袜白丝www | 久久精品人人做人人爽97 | 国产视频中文字幕 | 亚洲va欧美va天堂v国产综合 | 欧美日韩一品道 | 欧美ggg666| 99久久精品免费观看区一 | 亚洲欧美成人综合久久久 | 国四虎影永久 | 男男浴室吸乳play | 成人在线第一页 | 成人私人影院www片免费高清 | 变态 另类 人妖小说 | 亚洲AV蜜桃永久无码精品无码网 | 99久久久久国产精品免费 | 日本b站一卡二不卡三卡四卡 | www红色一片在线观看版 | 91在线视频国产 | tubehdxx丝袜正片| 小sao货ji巴cao死你视频 | 男人午夜禁片在线观看 | 九九在线免费视频 | 精品无人区乱码1区2区3区在线 | 四虎免费影院在线播放 | 国产欧美日韩精品在线 | 久久免费看少妇高潮A片特爽 | evelynlin亚裔播放 | 成人伊在线影院 | 免费成人在线观看视频 | 关晓彤被调教出奶水 | 亚洲免费在线观看视频 | 男插女的下面免费视频夜色 | 婷婷影院在线观看 | 日韩不卡一区二区 | 久久九九精品国产自在现线拍 | 婷婷九月 | 久久久免费观成人影院 | 99久久免费国产香蕉麻豆 | 国产欧美日韩精品一区二区三区 |