1. 程式人生 > >詳解Mysql分散式事務XA(跨資料庫事務)

詳解Mysql分散式事務XA(跨資料庫事務)

在開發中,為了降低單點壓力,通常會根據業務情況進行分表分庫,將表分佈在不同的庫中(庫可能分佈在不同的機器上)。在這種場景下,事務的提交會變得相對複雜,因為多個節點(庫)的存在,可能存在部分節點提交失敗的情況,即事務的ACID特性需要在各個不同的資料庫例項中保證。比如更新db1庫的A表時,必須同步更新db2庫的B表,兩個更新形成一個事務,要麼都成功,要麼都失敗。
那麼我們如何利用mysql實現分散式資料庫的事務呢?

  • 資源管理器(resource manager):用來管理系統資源,是通向事務資源的途徑。資料庫就是一種資源管理器。資源管理還應該具有管理事務提交或回滾的能力。
  • 事務管理器(transaction manager):
    事務管理器是分散式事務的核心管理者。事務管理器與每個資源管理器(resource
    manager)進行通訊,協調並完成事務的處理。事務的各個分支由唯一命名進行標識。

mysql在執行分散式事務(外部XA)的時候,mysql伺服器相當於xa事務資源管理器,與mysql連結的客戶端相當於事務管理器。

分散式事務原理:分段式提交

分散式事務通常採用2PC協議,全稱Two Phase Commitment Protocol。該協議主要為了解決在分散式資料庫場景下,所有節點間資料一致性的問題。分散式事務通過2PC協議將提交分成兩個階段:

  • prepare;
  • commit/rollback

階段一為準備(prepare)階段

。即所有的參與者準備執行事務並鎖住需要的資源。參與者ready時,向transaction manager報告已準備就緒。
階段二為提交階段(commit)。當transaction manager確認所有參與者都ready後,向所有參與者傳送commit命令。
如下圖所示:
這裡寫圖片描述

事務協調者transaction manager

因為XA 事務是基於兩階段提交協議的,所以需要有一個事務協調者(transaction manager)來保證所有的事務參與者都完成了準備工作(第一階段)。如果事務協調者(transaction manager)收到所有參與者都準備好的訊息,就會通知所有的事務都可以提交了(第二階段)。MySQL 在這個XA事務中扮演的是參與者的角色,而不是事務協調者(transaction manager)。

Mysql的XA事務分為外部XA和內部XA

  • 外部XA用於跨多MySQL例項的分散式事務,需要應用層作為協調者,通俗的說就是比如我們在PHP中寫程式碼,那麼PHP書寫的邏輯就是協調者。應用層負責決定提交還是回滾,崩潰時的懸掛事務。MySQL資料庫外部XA可以用在分散式資料庫代理層,實現對MySQL資料庫的分散式事務支援,例如開源的代理工具:網易的DDB,淘寶的TDDL等等。
  • 內部XA事務用於同一例項下跨多引擎事務,由Binlog作為協調者,比如在一個儲存引擎提交時,需要將提交資訊寫入二進位制日誌,這就是一個分散式內部XA事務,只不過二進位制日誌的參與者是MySQL本身。Binlog作為內部XA的協調者,在binlog中出現的內部xid,在crash recover時,由binlog負責提交。(這是因為,binlog不進行prepare,只進行commit,因此在binlog中出現的內部xid,一定能夠保證其在底層各儲存引擎中已經完成prepare)。

MySQL XA事務基本語法

XA {START|BEGIN} xid [JOIN|RESUME] 啟動xid事務 (xid 必須是一個唯一值; 不支援[JOIN|RESUME]子句)
XA END xid [SUSPEND [FOR MIGRATE]] 結束xid事務 ( 不支援[SUSPEND [FOR MIGRATE]] 子句)
XA PREPARE xid 準備、預提交xid事務
XA COMMIT xid [ONE PHASE] 提交xid事務
XA ROLLBACK xid 回滾xid事務
XA RECOVER 檢視處於PREPARE 階段的所有事務

PHP呼叫MYSQL XA事務示例

1、首先要確保mysql開啟XA事務支援

SHOW VARIABLES LIKE '%xa%'

如果innodb_support_xa的值是ON就說明mysql已經開啟對XA事務的支援了。
如果不是就執行:

SET innodb_support_xa = ON

開啟

2、程式碼如下:

<?PHP
$dbtest1 = new mysqli("172.20.101.17","public","public","dbtest1")or die("dbtest1 連線失敗");
$dbtest2     = new mysqli("172.20.101.18","public","public","dbtest2")or die("dbtest2 連線失敗");

//為XA事務指定一個id,xid 必須是一個唯一值。
$xid = uniqid("");

//兩個庫指定同一個事務id,表明這兩個庫的操作處於同一事務中
$dbtest1->query("XA START '$xid'");//準備事務1
$dbtest2->query("XA START '$xid'");//準備事務2

try {
    //$dbtest1
    $return = $dbtest1->query("UPDATE member SET name='唐大麥' WHERE id=1") ;
    if($return == false) {
       throw new Exception("庫[email protected]執行update member操作失敗!");
    }

    //$dbtest2
    $return = $dbtest2->query("UPDATE memberpoints SET point=point+10 WHERE memberid=1") ;
    if($return == false) {
       throw new Exception("庫[email protected]執行update memberpoints操作失敗!");
    }

    //階段1:$dbtest1提交準備就緒
    $dbtest1->query("XA END '$xid'");
    $dbtest1->query("XA PREPARE '$xid'");
    //階段1:$dbtest2提交準備就緒
    $dbtest2->query("XA END '$xid'");
    $dbtest2->query("XA PREPARE '$xid'");

    //階段2:提交兩個庫
    $dbtest1->query("XA COMMIT '$xid'");
    $dbtest2->query("XA COMMIT '$xid'");
} 
catch (Exception $e) {
    //階段2:回滾
    $dbtest1->query("XA ROLLBACK '$xid'");
    $dbtest2->query("XA ROLLBACK '$xid'");
    die($e->getMessage());
}

$dbtest1->close();
$dbtest2->close();

?>

XA的效能問題

XA的效能很低。一個數據庫的事務和多個數據庫間的XA事務效能對比可發現,效能差10倍左右。因此要儘量避免XA事務,例如可以將資料寫入本地,用高效能的訊息系統分發資料。或使用資料庫複製等技術。只有在這些都無法實現,且效能不是瓶頸時才應該使用XA。

相關推薦

Mysql分散式事務XA資料庫事務查詢快取

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

Mysql分散式事務XA資料庫事務

在開發中,為了降低單點壓力,通常會根據業務情況進行分表分庫,將表分佈在不同的庫中(庫可能分佈在不同的機器上)。在這種場景下,事務的提交會變得相對複雜,因為多個節點(庫)的存在,可能存在部分節點提交失敗的情況,即事務的ACID特性需要在各個不同的資料庫例項中保證。

【轉載】oracle閃回技術之閃回drop神奇的flashback

寫在前面:刪庫跑路,相信這是絕大多數程式設計師會經常聽到的一個詞。俗話說:常在河邊走,哪有不溼鞋,作為經常和資料打交道的程式設計師也好,運維實施也好,有時難免會出現資料誤刪除,誤操作等情況。如果你是一個oracle使用者,那麼你如果知道這些關於資料閃回恢復的基本知識,或許可以幫你在出現類似情況的時候解決很多問

深入淺出Mybatis原始碼系列---配置之properties與environmentsmybatis原始碼篇

上篇文章《深入淺出Mybatis原始碼系列(二)---配置簡介(mybatis原始碼篇)》我們通過對mybatis原始碼的簡單分析,可看出,在mybatis配置檔案中,在configuration根節點下面,可配置properties、typeAliases、plugins、

oracle閃回技術之閃回drop神奇的flashback

寫在前面:刪庫跑路,相信這是絕大多數程式設計師會經常聽到的一個詞。俗話說:常在河邊走,哪有不溼鞋,作為經常和資料打交道的程式設計師也好,運維實施也好,有時難免會出現資料誤刪除,誤操作等情況。如果你是一個oracle使用者,那麼你如果知道這些關於資料閃回恢復的基本

確定有限狀態機和非確定有限狀態機 包含Java實現原始碼Nondeterministic finite automata

本文將講解確定有限自動狀態機和非確定有限自動狀態機的特點和區別。將結合圖片例子重點講解什麼是非確定有限自動狀態機。最後講解如何將非確定狀態機轉換為確定的狀態機。多圖預警!! 有限自動狀態機可以分為確定的和不確定的。“確定性”將在下文詳講。“有限”性表示存在一個

深入淺出Mybatis系列---配置之properties與environmentsmybatis原始碼篇

上篇文章《深入淺出Mybatis系列(二)---配置簡介(mybatis原始碼篇)》我們通過對mybatis原始碼的簡單分析,可看

MySQL中concat函數的用法連接字符串

連接 container 使用方法 字符串 border IT 冗余 str () MySQL中concat函數 使用方法: CONCAT(str1,str2,…) 返回結果為連接參數產生的字符串。如有任何一個參數為NULL ,則返回值為 NULL。

Mysql事務、索引、視圖

詳細信息 fad mysql 出現一次 text esc 這一 虛擬 內存 索引簡介 索引是為了加速對表中數據行的檢索而創建的一種分散的存儲結構。索引是針對表而建立的,它是由數據頁面以外的索引頁面組成的,每個索引頁面中的行都會含有邏輯指針,以便加速檢索物理數據。 索引作用

Zookeeper技術:分散式架構分散式技術分散式事務

一、分散式架構詳解 1、分散式發展歷程 1.1 單點集中式 特點:App、DB、FileServer都部署在一臺機器上。並且訪問請求量較少 1.2  應用服務和資料服務拆分  特點:App、DB、FileServer分別部署在獨立伺服器上。並且訪問請求量較少 1.3

MYSQL資料庫密碼的加密方式及破解方法2

2.將MySQL使用者密碼字串加入到Cain破解列表     本文使用Cain & Abel 來破解MYSQL資料庫使用者密碼,Cain & Abel是一個可以破解屏保、PWL密碼、共享密碼、快取口令、遠端共享口令、SMB口令、支援VNC口令解碼、C

Session分散式共享.NET CORE版

一、前言&回顧        在上篇文章Session分散式共享 = Session + Redis + Nginx中,好多同學留言問了我好多問題,其中印象深刻的有:nginx掛了怎麼辦?採用Redis的Session方案與微軟Session方案相比,有什麼

MySQL執行事務的語法和流程

摘要:MySQL 提供了多種儲存引擎來支援事務。 MySQL 提供了多種儲存引擎來支援事務。支援事務的儲存引擎有 InnoDB 和 BDB,其中,InnoDB 儲存引擎事務主要通過 UNDO 日誌和 REDO 日誌實現,MyISAM 儲存引擎不支援事務。 拓展:任何一種資料庫,都會擁有各種各樣的日誌,用來記錄

MySQL事務原理

老劉是即將找工作的研究生,自學大資料開發,一路走來,感慨頗深,網上大資料的資料良莠不齊,於是想寫一份詳細的大資料開發指南。這份指南把大資料的【基礎知識】【框架分析】【原始碼理解】都用自己的話描述出來,讓夥伴自學從此不求人。 您的點贊是我持續更新的動力,禁止白嫖,看了就要有收穫,一起加油。 今天給大家分

C# Tuple VS ValueTuple元組類 VS 值元組

edit 成員 擴展 ati art info ets 簡單 ole C# 7.0已經出來一段時間了,大家都知道新特性裏面有個對元組的優化,並且網上也有大量的介紹,這裏利用詳盡的例子詳解Tuple VS ValueTuple(元組類VS值元組),10分鐘讓你更了解Value

OSI七層之四 傳輸層Transport

http 計算機 地址 包括 分組 tcp aik 全部 滿足 一、簡介   第四層的數據單元也稱作數據包(packets)。但是,當你談論TCP等具體的協議時又有特殊的叫法,TCP的數據單元稱為段(segments)而UDP協議的數據單元稱為“數據報(datagrams)

javascript 中的比較==和===

不一致 mit 如果 asc onu tin 算法 復雜 undefine 抽象相等比較算法 比較運算 x==y, 其中 x 和 y 是值,產生 true 或者 false。這樣的比較按如下方式進行: 若 Type(x) 與 Type(y) 相同, 則 若 Type(x)

MySQL基準測試和sysbench工具

threads 組件 程序 原因 str 前言 全面 無法連接 不同 前言 作為一名後臺開發,對數據庫進行基準測試,以掌握數據庫的性能情況是非常必要的。本文介紹了MySQL基準測試的基本概念,以及使用sysbench對MySQL進行基準測試的詳細方法。 文章有疏漏之處,歡迎

MySQL基準測試和sysbench工具(轉)

lua 增刪 後臺 simple ads 執行時間 bench 進行 響應 前言 作為一名後臺開發,對數據庫進行基準測試,以掌握數據庫的性能情況是非常必要的。本文介紹了MySQL基準測試的基本概念,以及使用sysbench對MySQL進行基準測試的詳細方法。 文章有疏漏

串口驅動程序設計---串口初始化

flag more ini board 幾分鐘 cor configure 設計 rom 串口驅動程序設計詳解---串口初始化(上) 原創 2016年05月19日 23:51:13 標簽: 串口驅動初始化流程 / 內核源碼分析 / linux / ARM / 架構