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

2022-09-21 01:00:09 字數 1601 閱讀 8007

目錄

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

那麼,mysql如何實現多個mysql資料庫更新的一致性呢?那就是mysql xa。mysql正是靠支援xa規範的二階段提交協議,才實現了多個資料庫的操作。

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

各個模組的作用如下:

剛開始看可能覺得不好理解,總結起來該架構就是應用程式訪問及使用資環管理器提供的共享資源,通過事務管理器提供的事務介面(tx inte***ce)定義事務操作。事務管理器和資源管理會基於xa規範執行二階段提交協議。

xa規範流程如下圖所示

mysql中存在兩種xa事務,一種是內部xa事務主要用來協調儲存引擎和二進位制日誌,一種是外部事務可以參與到外部分布式事務中(比如多個資料庫實現的分布式事務),這裡我們主要討論外部事務。

注:mysql中只有當隔離級別設定為serializable的時候才能使用分布式事務。

mysql的xa語法如下

xa 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應該具有的功能。

一文搞懂transform skew

目錄 如何理解斜切 skew,先看乙個 demo。在下面的 demo 中,有 4 個正方形,分別是 紅色 不做 skew 變換,綠色 x 方向變換,藍色 y 方向變換,黑色 兩個方向都變換,拖動下面的滑塊可以檢視改變 skew 角度後的效果。切換 selector 可以設定 transform or...

一文搞懂Nginx限流 簡單實現

nginx現在已經是最火的負載均衡之一,在流量陡增的網際網路面前,介面限流也是很有必要的,尤其是針對高併發的場景。nginx的限流主要是兩種方式 限制訪問頻率和限制併發連線數。限流 rate limiting 是nginx眾多特性中最有用的,也是經常容易被誤解和錯誤配置的,特性之一。該特性可以限制某...

一文搞懂property函式

接下來我帶大家了解乙個函式的作用以及使用技巧,希望對大家都有幫助,話不多說,接下來就開始我的表演特性 首先property有兩種用法,一種是作為函式的用法,一種是作為裝飾器的用法,接下來我們就逐一分析 property函式 看一下作為函式它包含的引數都有哪些 property fget none,f...