欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

一文搞懂MySQL XA如何實現(xiàn)分布式事務

 更新時間:2021年11月08日 10:09:00   作者:神技圈子  
MySQL如何實現(xiàn)多個MySQL數(shù)據庫更新的一致性呢?那就是MySQL XA,本文就來介紹一下MySQL XA如何實現(xiàn)分布式事務,具有一定的參考價值,感興趣的可以了解一下

前言

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

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

XA 協(xié)議

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

在這里插入圖片描述

各個模塊的作用如下:

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

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

在這里插入圖片描述

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

如何通過MySQL XA實現(xiàn)分布式事務

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

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

在這里插入圖片描述

執(zhí)行結果

在這里插入圖片描述

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

在這里插入圖片描述

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

在這里插入圖片描述

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

在這里插入圖片描述

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

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

相關文章

  • Mysql?sql?如何對行數(shù)據求和

    Mysql?sql?如何對行數(shù)據求和

    這篇文章主要介紹了Mysql使用sql實現(xiàn)對行數(shù)據求和問題,具有很好的參考價值,希望對大家有所幫助。
    2023-05-05
  • Mysql指定某個字符串字段前面幾位排序查詢方式

    Mysql指定某個字符串字段前面幾位排序查詢方式

    這篇文章主要介紹了Mysql指定某個字符串字段前面幾位排序查詢方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-03-03
  • MySQL5.5.27安裝圖文教程

    MySQL5.5.27安裝圖文教程

    本文通過圖文并茂的形式給大家介紹了mysql 5.5.27的安裝教程,非常不錯,具有參考借鑒價值,需要的朋友參考下吧
    2017-09-09
  • 使用MYSQL TIMESTAMP字段進行時間加減運算問題

    使用MYSQL TIMESTAMP字段進行時間加減運算問題

    這篇文章主要介紹了使用MYSQL TIMESTAMP字段進行時間加減運算問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-02-02
  • MySQL數(shù)據庫遭到攻擊篡改(使用備份和binlog進行數(shù)據恢復)

    MySQL數(shù)據庫遭到攻擊篡改(使用備份和binlog進行數(shù)據恢復)

    這篇文章主要介紹了MySQL數(shù)據庫遭到攻擊篡改(使用備份和binlog進行數(shù)據恢復),需要的朋友可以參考下
    2016-04-04
  • mysql 8.0.12 安裝配置教程

    mysql 8.0.12 安裝配置教程

    這篇文章主要為大家詳細介紹了mysql 8.0.12安裝配置方法圖文教程,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-09-09
  • Mysql 自定義隨機字符串的實現(xiàn)方法

    Mysql 自定義隨機字符串的實現(xiàn)方法

    前段時間接了一個項目,需要用到隨機字符串,但是mysql的庫函數(shù)沒有直接提供,需要我們自己實現(xiàn)此功能,下面小編給大家介紹下Mysql 自定義隨機字符串的實現(xiàn)方法,需要的朋友參考下吧
    2016-08-08
  • 數(shù)據庫報錯:Unknown column 'xxx' in 'where clause'問題的解決過程

    數(shù)據庫報錯:Unknown column 'xxx' in 

    但凡寫過sql語句的人估計都曾經碰到過類似于Unknown column ‘xxx’ in ‘where clause’的問題,這篇文章主要給大家介紹了關于數(shù)據庫報錯:Unknown column 'xxx' in 'where clause'問題的解決過程,需要的朋友可以參考下
    2023-03-03
  • 解決Mysql:ERROR?1045?(28000):Access?denied?for?user?‘root‘@‘localhost‘?(using?password:?NO)的方法

    解決Mysql:ERROR?1045?(28000):Access?denied?for?user?‘roo

    最近在我們連接數(shù)據庫的時候遇到個問題,感覺還挺容易遇到的,所以總結下,這篇文章主要給大家介紹了關于解決Mysql:ERROR?1045?(28000):Access?denied?for?user?‘root‘@‘localhost‘?(using?password:?NO)的方法,需要的朋友可以參考下
    2022-06-06
  • C++連接使用MySQL的方法

    C++連接使用MySQL的方法

    這篇文章主要為大家詳細介紹了C++連接使用MySQL的方法,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-07-07

最新評論