国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 數(shù)據(jù)庫 > MySQL > 正文

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

2024-07-24 12:31:55
字體:
來源:轉載
供稿:網友
        MySQL數(shù)據(jù)庫分布式事務XA的實現(xiàn)原理分析:

  1 原理
 
  關于MySQL數(shù)據(jù)庫的分布式事務XA,分布式事務實現(xiàn)的原理,可見[3];關于MySQL XA的說明,可見[1][2]。
 
  源代碼分析基于MySQL 5.1.49,MySQL 5.5.16。
 
  2 MySQL處理流程
 
  2.1 MySQL 外部XA – 正常處理流程
 
  MySQL數(shù)據(jù)庫外部XA的正常處理流程,這里不準備介紹,可以參考[1][2][3]。接下來我重點描述一下MySQL數(shù)據(jù)庫外部分布式事務XA的崩潰恢復流程,畢竟此流程跟應用程序如何正確使用外部XA息息相關。
 
  2.2 MySQL外部XA – 崩潰恢復流程
 
  若一個運行外部XA分布式事務的MySQL數(shù)據(jù)庫節(jié)點發(fā)生崩潰,那么其重啟之后的崩潰恢復,涉及到外部XA處理的流程如下:
 
  Crash recover:
 
// 1. 讀取binlog文件,將文件中的xid存入commit_list hash表
  // 顧名思義,所謂的commit_list,就是說此list中對應prepare狀態(tài)的xid
  // 在崩潰恢復過程中均可以被提交,而不在commit_list中的xid,均須回滾
  // binlog中的xid,都是屬于內部xid,由MySQL產生,用于內部XA
  Log.cc::TC_LOG_BINLOG::recover
  // 2. 遍歷底層所有的事務引擎,收集處于XA_PREPARED狀態(tài)的所有xid
  // 這些xid列表,既包括內部xid,也包括外部xid,存儲引擎內部不做區(qū)分
  Handler.cc::ha_recover(commit_list)
  // 執(zhí)行各引擎層面提供的recover方法,收集所有的處于prepared狀態(tài)的xid
  // 根據(jù)xid分類:
  // 3. 若xid屬于內部xid,那么在commit_list中查找此xid,
  // 若存在,則提交此xid對應的事務;否則,回滾此事務
  // 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)
  // 若當前為內部xid,同時此xid在binlog中存在,則提交
  hton->commit_by_xid();
  else
  // 若當前為內部xid,同時此xid在binlog中不存在,則回滾
  hton->rollback_by_xid();
  
  xa recover命令處理流程:
 
sql_parse.cc::mysql_execute_command
  case SQLCOM_XA_RECOVER:
  mysql_xa_recover();
  // 遍歷xid_cache,找出其中的狀態(tài)處于XA_PREPARED的事務,發(fā)送客戶端
  while (xs = hash_element(&xid_cache,))
  if (xs->xa_state == XA_PREPARED)
  protocol->write();
  根據(jù)xa recover命令收集到的各MySQL數(shù)據(jù)庫實例返回的xid列表,然后再對比應用程序端日志,決定這些xid,哪些全局commit,哪些rollback。
 
  由于測試中只有一個MySQL數(shù)據(jù)庫實例,因此此時可以直接選擇commit處于prepare狀態(tài)的xid。
 
  注:
 
MySQL內部xid格式: MYSQL_XID_PREFIX + server_id + my_xid
MYSQL_XID_PREFIX: MySQLXid (源碼寫死) 8 bytes
server_id: MySQL實例的id,ulong, 4 bytes
my_xid: 內部自增序列,ulonglong, 8 bytes
例如:”MySQLXid 0004”
server_id = ‘ ’;my_xid = 4
  因此,使用時應該注意,不要在外部構造這種形式的xid,否則MySQL數(shù)據(jù)庫就會將內部xid與外部xid混淆。
 
  一般情況下,構造一個內部xid比較困難,由于server_id一般小于4 bytes,不足的部分以ASCI NIL(null)補齊,而應用程序一般都不會構造此類的外部xid。
 

(編輯:武林網)

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 老河口市| 新营市| 阿荣旗| 邯郸县| 苍梧县| 丽江市| 禄丰县| 樟树市| 武定县| 鹰潭市| 阜新| 津市市| 新野县| 辽中县| 桂阳县| 龙里县| 方正县| 治县。| 大新县| 城市| 塔河县| 平潭县| 基隆市| 鹿邑县| 漳浦县| 万荣县| 女性| 绍兴市| 和静县| 凌源市| 富源县| 南汇区| 仪征市| 芜湖县| 方城县| 会理县| 湖州市| 南溪县| 临猗县| 澄迈县| 桐梓县|