我的编程空间,编程开发者的网络收藏夹
学习永远不晚

MySQL数据库分布式事务XA的实现原理分析

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

MySQL数据库分布式事务XA的实现原理分析

  1 原理

  关于MySQL数据库的分布式事务XA,分布式事务实现的原理,可见[3];关于MySQL XA的说明,可见[1][2]。

  MySQL XA分为两类,内部XA与外部XA;内部XA用于同一实例下跨多个引擎的事务,由大家熟悉的Binlog作为协调者;外部XA用于跨多MySQL实例的分布式事务,需要应用层介入作为协调者(崩溃时的悬挂事务,全局提交还是回滚,需要由应用层决定,对应用层的实现要求较高);

  本文,假设读者已经知道MySQL数据库外部分布式事务XA的使用,而将重点放在MySQL数据库,如何处理外部分布式事务XA的crash recover,以及面对不同的crash recover的情形,应用程序如何处理,才能够保证分布式事务的一致性。最后,本文简单分析一下目前MySQL数据库外部XA支持存在的问题,以及可选的解决方案。

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

  2 MySQL处理流程

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

  MySQL数据库外部XA的正常处理流程,这里不准备介绍,可以参考[1][2][3]。接下来我重点描述一下MySQL数据库外部分布式事务XA的崩溃恢复流程,毕竟此流程跟应用程序如何正确使用外部XA息息相关。

  2.2 MySQL外部XA – 崩溃恢复流程

  若一个运行外部XA分布式事务的MySQL数据库节点发生崩溃,那么其重启之后的崩溃恢复,涉及到外部XA处理的流程如下:

  Crash recover:

// 1. 读取binlog文件,将文件中的xid存入commit_list hash表 
  // 顾名思义,所谓的commit_list,就是说此list中对应prepare状态的xid 
  // 在崩溃恢复过程中均可以被提交,而不在commit_list中的xid,均须回滚 
  // binlog中的xid,都是属于内部xid,由MySQL产生,用于内部XA 
  Log.cc::TC_LOG_BINLOG::recover 
  // 2. 遍历底层所有的事务引擎,收集处于XA_PREPARED状态的所有xid 
  // 这些xid列表,既包括内部xid,也包括外部xid,存储引擎内部不做区分 
  Handler.cc::ha_recover(commit_list) 
  // 执行各引擎层面提供的recover方法,收集所有的处于prepared状态的xid 
  // 根据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状态的所有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();

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

MySQL数据库分布式事务XA的实现原理分析

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

fescar分布式事务实现原理实例分析

这篇文章主要介绍了fescar分布式事务实现原理实例分析的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇fescar分布式事务实现原理实例分析文章都会有所收获,下面我们一起来看看吧。项目说明本博文所述代码为fes
2023-06-29

Java中TCC分布式事务的实现原理

这篇文章给大家分享的是有关Java中TCC分布式事务的实现原理的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。Java的特点有哪些Java的特点有哪些1.Java语言作为静态面向对象编程语言的代表,实现了面向对象理
2023-06-14

MySQL插入锁与数据库分布式事务的处理

MySQL中的插入锁是一种锁机制,用于在插入数据时保护数据的完整性。当一个事务在插入数据时获取了插入锁,其他事务就无法插入相同的数据,直到第一个事务释放了锁。当涉及到数据库分布式事务处理时,MySQL中的插入锁可以帮助确保数据的一致性。在
MySQL插入锁与数据库分布式事务的处理
2024-08-14

redis分布式锁的实现原理实例分析

这篇文章主要介绍了redis分布式锁的实现原理实例分析的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇redis分布式锁的实现原理实例分析文章都会有所收获,下面我们一起来看看吧。首先,为了确保分布式锁可用,我们至
2023-06-29

如何通过AmazonAurora实现数据库的分布式事务处理

Amazon Aurora是一个关系型数据库服务,其支持分布式事务处理。要通过Amazon Aurora实现数据库的分布式事务处理,可以按照以下步骤进行操作:使用Amazon Aurora的集群功能: Amazon Aurora支持在多个数
如何通过AmazonAurora实现数据库的分布式事务处理
2024-04-09

JPA多数据源分布式事务的示例分析

这篇文章主要介绍了JPA多数据源分布式事务的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。问题背景在解决mysql字段脱敏处理时,结合sharding-jdbc的脱敏
2023-06-29

Redisson分布式限流的实现原理解析

目录正文RRateLimiter使用RRateLimiter的实现RRateLimiter使用时注意事项RRateLimiter是非公平限流器Rate不要设置太大限流的上限取决于Redis单实例的性能分布式限流的本质正文我们目前在工作中遇到
2023-02-12

怎么理解高并发下的数据库分布式事务

这篇文章主要介绍“怎么理解高并发下的数据库分布式事务”,在日常操作中,相信很多人在怎么理解高并发下的数据库分布式事务问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”怎么理解高并发下的数据库分布式事务”的疑惑有所
2023-06-02

mysql分布式集群实现的原理是什么

MySQL分布式集群实现的原理主要依靠数据分片、数据复制和数据同步来实现。具体原理如下:数据分片:将数据库中的数据划分为多个片段,每个片段称为一个分片。每个分片可以存储在不同的物理服务器上,实现数据的分布式存储和处理。数据复制:在每个分片内
mysql分布式集群实现的原理是什么
2024-04-09

Spring数据库连接池实现原理实例分析

这篇“Spring数据库连接池实现原理实例分析”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Spring数据库连接池实现原理
2023-07-04

编程热搜

目录