MySQL分布式事務

2021-08-09 06:39:18 字數 1253 閱讀 4206

mysql5.0.3開始支援分布式事務,只支援innodb引擎。

1. 分布式事務原理

使用分布式事務的應用程式涉及乙個或多個資源管理器和乙個事務管理器。

資源管理器(rm)用於提供通向事務資源的途徑,資料庫伺服器是一種資源管理器。該管理器必須可以提交或回滾由rm管理的事務。

事務管理器(tm)用於協調作為乙個分布式事務一部分的事務。tm與管理每個事務的rms進行通訊。在乙個分布式事務中,各個單個事務均是分布式事務的「分支事務」。分布式事務和各分支通過一種命名方法進行標識。

用於執行分布式事務的過程使用兩階段提交,發生時間在由分布式事務的各個分支需要進行的行動已經被執行之後。

第一階段,tm告知分支事務預備好提交,用於管理分支rm會記錄分支行動,分支會指示是否可以提交,這個指示會用在第二個階段。

第二階段,tm告知rms是否提交或回滾。所有分支指示可以提交,則所有分支被告知提交,有任何分支指示不能提交則所有分支被告知回滾。

2.分布式事務語法

分布式事務(xa事務)的sql語法主要包括:

xa xid     啟動乙個xa事務 (xid 必須是乙個唯一值; )    

xa end xid    結束乙個xa事務 

xa prepare xid    準備

xa commit xid [one phase]    提交xa事務

xa rollback xid  回滾xa事務

xa recover   檢視處於prepare 階段的所有xa事務

事務識別符號xid

xid 是乙個xa事務識別符號,它由客戶端提供或者有mysql伺服器生成。

xid的格式一般為 xid : gtrid [, bqual [, formatid]] ;

gtrid是乙個分布式事務識別符號,

bqual是乙個分支限定符,預設是空串

formatid是乙個數字,用於標識由gtrid和bqual值使用的格式,預設值是1。

3.存在的問題

如果分布式在達到prepare狀態時,資料庫異常重新啟動,伺服器重新啟動後,可以繼續對分支事務進行提交或者回滾操作,但是提交的事務沒有寫binlog,可能導致使用binlog恢復丟失部分資料。如果存在複製的資料庫,有可能導致主從的護具庫的資料不一致。

mysql分布式事務

儲引擎實現事務的通用方式是基於 redo log 和 undo log。簡單來說,redo log 記錄事務修改後的資料,undo log 記錄事務前的原始資料。所以當乙個事務執行時實際發生過程簡化描述如下 先記錄 undo redo log,確保日誌刷到磁碟上持久儲存。更新資料記錄,快取操作並非同...

MYSQL分布式事務

在開發中,為了降低單點壓力,通常會根據業務情況進行分表分庫,將表分布在不同的庫中 庫可能分布在不同的機器上 在這種場景下,事務的提交會變得相對複雜,因為多個節點 庫 的存在,可能存在部分節點提交失敗的情況,即事務的acid特性需要在各個不同的資料庫例項中保證。比如更新db1庫的a表時,必須同步更新d...

Mysql分布式事務

關於mysql分布式事務介紹,可參考 分為兩個階段 準備和執行階段。有兩個角色 事務的管理者 tm 和事務執行者 rm,mysql server xa start 事務啟動標識,使事務處於active狀態 xa end 事務結束標識,使事務處於idle狀態 當事務處於idle狀態,可 xa prep...