成人午夜视频全免费观看高清-秋霞福利视频一区二区三区-国产精品久久久久电影小说-亚洲不卡区三一区三区一区

MySQL數(shù)據(jù)庫分布式事務(wù)XA的實現(xiàn)原理分析

 1 原理

海鹽網(wǎng)站建設(shè)公司創(chuàng)新互聯(lián)建站,海鹽網(wǎng)站設(shè)計制作,有大型網(wǎng)站制作公司豐富經(jīng)驗。已為海鹽1000+提供企業(yè)網(wǎng)站建設(shè)服務(wù)。企業(yè)網(wǎng)站搭建\外貿(mào)網(wǎng)站建設(shè)要多少錢,請找那個售后服務(wù)好的海鹽做網(wǎng)站的公司定做!

關(guān)于MySQL數(shù)據(jù)庫的分布式事務(wù)XA,分布式事務(wù)實現(xiàn)的原理,可見[3];關(guān)于MySQL XA的說明,可見[1][2]。

MySQL XA分為兩類,內(nèi)部XA與外部XA;內(nèi)部XA用于同一實例下跨多個引擎的事務(wù),由大家熟悉的Binlog作為協(xié)調(diào)者;外部XA用于跨多MySQL實例的分布式事務(wù),需要應(yīng)用層介入作為協(xié)調(diào)者(崩潰時的懸掛事務(wù),全局提交還是回滾,需要由應(yīng)用層決定,對應(yīng)用層的實現(xiàn)要求較高);

本文,假設(shè)讀者已經(jīng)知道MySQL數(shù)據(jù)庫外部分布式事務(wù)XA的使用,而將重點放在MySQL數(shù)據(jù)庫,如何處理外部分布式事務(wù)XA的crash recover,以及面對不同的crash recover的情形,應(yīng)用程序如何處理,才能夠保證分布式事務(wù)的一致性。最后,本文簡單分析一下目前MySQL數(shù)據(jù)庫外部XA支持存在的問題,以及可選的解決方案。

源代碼分析基于MySQL 5.1.49,MySQL 5.5.16。

 2 MySQL處理流程

 2.1 MySQL 外部XA – 正常處理流程

MySQL數(shù)據(jù)庫外部XA的正常處理流程,這里不準備介紹,可以參考[1][2][3]。接下來我重點描述一下MySQL數(shù)據(jù)庫外部分布式事務(wù)XA的崩潰恢復(fù)流程,畢竟此流程跟應(yīng)用程序如何正確使用外部XA息息相關(guān)。

 2.2 MySQL外部XA – 崩潰恢復(fù)流程

若一個運行外部XA分布式事務(wù)的MySQL數(shù)據(jù)庫節(jié)點發(fā)生崩潰,那么其重啟之后的崩潰恢復(fù),涉及到外部XA處理的流程如下:

Crash recover:

// 1. 讀取binlog文件,將文件中的xid存入commit_list hash表 
// 顧名思義,所謂的commit_list,就是說此list中對應(yīng)prepare狀態(tài)的xid 
// 在崩潰恢復(fù)過程中均可以被提交,而不在commit_list中的xid,均須回滾 
// binlog中的xid,都是屬于內(nèi)部xid,由MySQL產(chǎn)生,用于內(nèi)部XA 
Log.cc::TC_LOG_BINLOG::recover 
// 2. 遍歷底層所有的事務(wù)引擎,收集處于XA_PREPARED狀態(tài)的所有xid 
// 這些xid列表,既包括內(nèi)部xid,也包括外部xid,存儲引擎內(nèi)部不做區(qū)分 
Handler.cc::ha_recover(commit_list) 
// 執(zhí)行各引擎層面提供的recover方法,收集所有的處于prepared狀態(tài)的xid 
// 根據(jù)xid分類: 
// 3. 若xid屬于內(nèi)部xid,那么在commit_list中查找此xid, 
// 若存在,則提交此xid對應(yīng)的事務(wù);否則,回滾此事務(wù) 
// 4. 若xid屬于外部xid,那么則將xid插入xid_cache hash表 
// xid_cache中的所有xid,將會通過xa recover命令返回,等待外部程序決策 
Handler.cc::xarecover_handlerton 
// 5. 收集InnoDB存儲引擎中,處于prepare狀態(tài)的所有xid,并返回 
got = hton->recover (innobase_xa_recover) 
my_xid x = info->list[i].get_my_xid(); 
if (!x) 
// 若當前為外部xid,那么將xid插入xid_cache hash表 
xid_cache_insert(&xid_cache, x); 
else 
if (x in commit_list) 
// 若當前為內(nèi)部xid,同時此xid在binlog中存在,則提交 
hton->commit_by_xid(); 
else 
// 若當前為內(nèi)部xid,同時此xid在binlog中不存在,則回滾 
hton->rollback_by_xid();

通過以上的分析,可以總結(jié)出:

MySQL數(shù)據(jù)庫內(nèi)部,會對xid做區(qū)分。內(nèi)部xid有MySQL數(shù)據(jù)庫自己產(chǎn)生(MySQL內(nèi)部xid格式,將在本文下面給出),用于多引擎間事務(wù)的一致性;外部xid由應(yīng)用程序給出,用于跨多MySQL實例的分布式事務(wù)。但是存儲引擎層不做區(qū)分(區(qū)分在MySQL上層)。

crash recover時,存儲引擎負責將引擎內(nèi)部,處于prepare狀態(tài)的事務(wù)收集,并返回MySQL上層。

Binlog作為內(nèi)部XA的協(xié)調(diào)者[5],在binlog中出現(xiàn)的內(nèi)部xid,在crash recover時,由binlog負責提交;在binlog中未出現(xiàn)的xid,由binlog負責回滾。(這是因為,binlog不進行prepare,只進行commit,因此在binlog中出現(xiàn)的內(nèi)部xid,一定能夠保證其在底層各存儲引擎中已經(jīng)完成prepare)。

外部XA事務(wù)的xid,在crash recover過程中僅僅是插入xid_cache中,而不做其他處理。等到用戶發(fā)起xa recover命令時,將xid_cache中處于prepare狀態(tài)的xid返回。

xa recover命令的流程處理如下。

xa recover命令處理流程:

sql_parse.cc::mysql_execute_command 
case SQLCOM_XA_RECOVER: 
mysql_xa_recover(); 
// 遍歷xid_cache,找出其中的狀態(tài)處于XA_PREPARED的事務(wù),發(fā)送客戶端 
while (xs = hash_element(&xid_cache,)) 
if (xs->xa_state == XA_PREPARED) 
protocol->write();

根據(jù)xa recover命令收集到的各MySQL數(shù)據(jù)庫實例返回的xid列表,然后再對比應(yīng)用程序端日志,決定這些xid,哪些全局commit,哪些rollback。

由于測試中只有一個MySQL數(shù)據(jù)庫實例,因此此時可以直接選擇commit處于prepare狀態(tài)的xid。

注:

  • MySQL內(nèi)部xid格式: MYSQL_XID_PREFIX + server_id + my_xid
  • MYSQL_XID_PREFIX: MySQLXid (源碼寫死) 8 bytes
  • server_id: MySQL實例的id,ulong, 4 bytes
  • my_xid: 內(nèi)部自增序列,ulonglong, 8 bytes
  • 例如:”MySQLXid 0004”
  • server_id = ‘ ’;my_xid = 4

因此,使用時應(yīng)該注意,不要在外部構(gòu)造這種形式的xid,否則MySQL數(shù)據(jù)庫就會將內(nèi)部xid與外部xid混淆。

一般情況下,構(gòu)造一個內(nèi)部xid比較困難,由于server_id一般小于4 bytes,不足的部分以ASCI NIL(null)補齊,而應(yīng)用程序一般都不會構(gòu)造此類的外部xid。

    參考資料

    [1] Sergei Golubchik.  Distributed Transaction Processing with MySQL XA

    [2]  http://dev.mysql.com/doc/refman/5.1/en/xa.html

    [3] X/Open.  Distributed TP: The XA Specification

    [4] 陳思儒.  Amoeba

    [5] MariaDB WorkLog#132:  Transaction coordinator plugin

該文章出自 http://www.searchdatabase.com.cn/showcontent_58646.htm

標題名稱:MySQL數(shù)據(jù)庫分布式事務(wù)XA的實現(xiàn)原理分析
本文地址:http://jinyejixie.com/article32/iisdsc.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供定制開發(fā)、網(wǎng)站維護、網(wǎng)站建設(shè)、做網(wǎng)站、App開發(fā)、小程序開發(fā)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

h5響應(yīng)式網(wǎng)站建設(shè)
西昌市| 北碚区| 德清县| 新密市| 永安市| 普宁市| 开鲁县| 宝应县| 桐柏县| 浦江县| 华容县| 滨州市| 桐柏县| 突泉县| 昭苏县| 潼关县| 永安市| 库尔勒市| 张家川| 黄骅市| 托里县| 西平县| 隆林| 犍为县| 海城市| 江川县| 南皮县| 靖安县| 茶陵县| 子洲县| 南安市| 梓潼县| 子长县| 奎屯市| 阿荣旗| 扎兰屯市| 同德县| 万宁市| 通山县| 侯马市| 金寨县|